diff --git a/package.json b/package.json index 5bdc93a248..b86e7c3eab 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,6 @@ "packages/twenty-utils", "packages/twenty-zapier", "packages/twenty-website", - "packages/twenty-website-redone", "packages/twenty-docs", "packages/twenty-e2e-testing", "packages/twenty-shared", diff --git a/packages/twenty-website-redone/.dev.vars.example b/packages/twenty-website-redone/.dev.vars.example deleted file mode 100644 index 9cd2773ff6..0000000000 --- a/packages/twenty-website-redone/.dev.vars.example +++ /dev/null @@ -1,7 +0,0 @@ -NEXTJS_ENV=development - -# Stripe — use a test-mode key locally -STRIPE_SECRET_KEY= - -# Enterprise JWT — generate a test RSA keypair for local dev -ENTERPRISE_JWT_PRIVATE_KEY= diff --git a/packages/twenty-website-redone/.env.example b/packages/twenty-website-redone/.env.example deleted file mode 100644 index b3ac1c405d..0000000000 --- a/packages/twenty-website-redone/.env.example +++ /dev/null @@ -1,31 +0,0 @@ -# Public site URL — canonical origin used by metadataBase, sitemap, robots, -# OG/Twitter card URLs, Stripe checkout success URL, and the billing portal -# return URL. No trailing slash. Defaults to https://twenty.com when unset. -NEXT_PUBLIC_WEBSITE_URL= - -# Partner application — the form POSTs to /api/partner-application, which -# forwards the payload to this webhook with the secret as a bearer credential. -PARTNER_APPLICATION_WEBHOOK_URL= -PARTNER_APPLICATION_SECRET= - -# Partners marketplace — the Twenty workspace the partner directory reads from -# (server-side only) via the /s/partners REST endpoint. -TWENTY_PARTNERS_API_URL= -TWENTY_PARTNERS_API_KEY= - -# Stripe — self-hosted enterprise checkout & subscription APIs. -STRIPE_SECRET_KEY= -STRIPE_ENTERPRISE_MONTHLY_PRICE_ID= -STRIPE_ENTERPRISE_YEARLY_PRICE_ID= - -# RS256 key pair used to sign and verify enterprise license JWTs -# (use literal \n for newlines in the PEM values). -ENTERPRISE_JWT_PRIVATE_KEY= -ENTERPRISE_JWT_PUBLIC_KEY= - -# Optional: enterprise validity token lifetime in days (default 30). -# ENTERPRISE_VALIDITY_TOKEN_DURATION_DAYS= - -# Shared secret guarding the internal enterprise key reissue endpoint -# (POST /api/enterprise/reissue), used to regenerate an enterprise key. -ENTERPRISE_ADMIN_API_SECRET= diff --git a/packages/twenty-website-redone/.gitignore b/packages/twenty-website-redone/.gitignore deleted file mode 100644 index 343df47880..0000000000 --- a/packages/twenty-website-redone/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -/node_modules -/.next/ -/out/ -.DS_Store -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.env -.env* -!.env.example -*.tsbuildinfo -next-env.d.ts - -# OpenNext / Cloudflare Workers -.open-next/ -.wrangler/ -.dev.vars -cloudflare-env.d.ts diff --git a/packages/twenty-website-redone/.oxlintrc.json b/packages/twenty-website-redone/.oxlintrc.json deleted file mode 100644 index 766fbf702e..0000000000 --- a/packages/twenty-website-redone/.oxlintrc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "$schema": "../../node_modules/oxlint/configuration_schema.json", - "ignorePatterns": [], - "categories": { - "correctness": "error", - "suspicious": "error", - "perf": "error" - }, - "plugins": ["react", "typescript", "oxc", "unicorn"], - "rules": { - "react/react-in-jsx-scope": "off", - "typescript/no-explicit-any": "error", - "typescript/consistent-type-definitions": ["error", "type"], - "no-unused-vars": "error" - } -} diff --git a/packages/twenty-website-redone/jest.config.mjs b/packages/twenty-website-redone/jest.config.mjs deleted file mode 100644 index 861c0b385e..0000000000 --- a/packages/twenty-website-redone/jest.config.mjs +++ /dev/null @@ -1,44 +0,0 @@ -const baseProject = { - preset: '../../jest.preset.js', - setupFilesAfterEnv: ['/test/setup-jest-dom.ts'], - transformIgnorePatterns: [ - '/node_modules/(?!(twenty-ui|twenty-shared)/.*)', - '../../node_modules/(?!(twenty-ui|twenty-shared)/.*)', - ], - transform: { - '^.+\\.(ts|js|tsx|jsx|mjs)$': [ - '@swc/jest', - { - jsc: { - parser: { syntax: 'typescript', tsx: true }, - transform: { react: { runtime: 'automatic' } }, - }, - }, - ], - }, - moduleNameMapper: { - '^@/(.*)$': '/src/$1', - '^@lingui/core/macro$': '/test/lingui-macro-mock.ts', - }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'mjs'], -}; - -const jestConfig = { - projects: [ - { - ...baseProject, - displayName: 'node', - testEnvironment: 'node', - testMatch: ['/src/**/*.test.ts'], - }, - { - ...baseProject, - displayName: 'jsdom', - testEnvironment: 'jsdom', - testMatch: ['/src/**/*.test.tsx'], - }, - ], - coverageDirectory: './coverage', -}; - -export default jestConfig; diff --git a/packages/twenty-website-redone/lingui.config.ts b/packages/twenty-website-redone/lingui.config.ts deleted file mode 100644 index 4ecb9a8c26..0000000000 --- a/packages/twenty-website-redone/lingui.config.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { defineConfig } from '@lingui/conf'; -import { formatter } from '@lingui/format-po'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; - -import { WEBSITE_LOCALE_LIST } from './src/platform/i18n/website-locale-list'; - -export default defineConfig({ - sourceLocale: SOURCE_LOCALE, - locales: [...WEBSITE_LOCALE_LIST], - fallbackLocales: { - default: SOURCE_LOCALE, - }, - catalogs: [ - { - path: '/src/locales/{locale}', - include: ['src'], - }, - ], - catalogsMergePath: '/src/locales/generated/{locale}', - compileNamespace: 'ts', - format: formatter({ lineNumbers: false, printLinguiId: true }), -}); diff --git a/packages/twenty-website-redone/next.config.ts b/packages/twenty-website-redone/next.config.ts deleted file mode 100644 index f366dddfa1..0000000000 --- a/packages/twenty-website-redone/next.config.ts +++ /dev/null @@ -1,55 +0,0 @@ -import path from 'path'; -import { initOpenNextCloudflareForDev } from '@opennextjs/cloudflare'; -import withLinaria, { type LinariaConfig } from 'next-with-linaria'; - -import { localeToUrlSegment } from './src/platform/i18n/locale-to-url-segment'; -import { buildLocaleRewrites } from './src/platform/routing/locale-rewrite-patterns'; -import { WEBSITE_LOCALE_LIST } from './src/platform/i18n/website-locale-list'; - -// Bundler decision: Next 16 defaults dev and build to Turbopack, and -// next-with-linaria@1.3 branches on process.env.TURBOPACK to apply its -// Turbopack loader config — the same combination the original twenty-website -// already runs in dev. Webpack stays available behind `next dev --webpack` -// as the escape hatch if a wyw-in-js edge case surfaces. -const DEPLOYED_LOCALE_URL_SEGMENTS = - WEBSITE_LOCALE_LIST.map(localeToUrlSegment); - -const nextConfig: LinariaConfig = { - reactCompiler: true, - linaria: { - configFile: path.resolve(__dirname, 'wyw-in-js.config.cjs'), - }, - experimental: { - swcPlugins: [ - [ - '@lingui/swc-plugin', - { - runtimeModules: { - i18n: ['@lingui/core', 'i18n'], - trans: ['@lingui/react', 'Trans'], - }, - }, - ], - ], - }, - // Clean public URLs: the source locale is unprefixed, other locales get a - // short segment. Rewrites map unprefixed paths onto the internal /[locale] - // tree; redirects canonicalize away explicit source-locale prefixes. - async rewrites() { - return { - beforeFiles: buildLocaleRewrites(DEPLOYED_LOCALE_URL_SEGMENTS), - }; - }, - async redirects() { - return [ - { source: '/en', destination: '/', statusCode: 301 }, - { source: '/en/:path*', destination: '/:path*', statusCode: 301 }, - ]; - }, -}; - -export default withLinaria(nextConfig); - -// Binds the Cloudflare dev context (R2 incremental cache, env vars) into -// `next dev` so local runs mirror the deployed OpenNext worker. -initOpenNextCloudflareForDev(); diff --git a/packages/twenty-website-redone/open-next.config.ts b/packages/twenty-website-redone/open-next.config.ts deleted file mode 100644 index 34c3cbffa7..0000000000 --- a/packages/twenty-website-redone/open-next.config.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { defineCloudflareConfig } from '@opennextjs/cloudflare'; -import r2IncrementalCache from '@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache'; -import { withRegionalCache } from '@opennextjs/cloudflare/overrides/incremental-cache/regional-cache'; - -// Worker custom-domain hostnames bypass the zone-level Cache Rule for -// synthetic responses (OpenNext builds responses from R2 reads rather than -// `fetch()`-ing an origin). Wrapping the R2 incremental cache with the -// regional cache means cache-hit reads come from CF's per-region Cache API -// (~10ms) instead of R2 (~100ms), recovering most of the TTFB the migration -// lost. -const incrementalCache = withRegionalCache(r2IncrementalCache, { - mode: 'long-lived', -}); - -const baseConfig = defineCloudflareConfig({ - incrementalCache, -}); - -// `defineCloudflareConfig` only takes the `CloudflareOverrides` subset of the -// config today; `skewProtection` lives directly under `cloudflare.*` and has to -// be merged in. See packages/cloudflare/src/api/config.ts in opennextjs-cloudflare. -export default { - ...baseConfig, - cloudflare: { - ...baseConfig.cloudflare, - skewProtection: { - enabled: true, - // Window large enough to keep prod-version history for skew routing AND - // hold one slot per open PR preview. `maxVersionAgeDays` prunes the rest. - maxNumberOfVersions: 50, - maxVersionAgeDays: 14, - }, - }, -}; diff --git a/packages/twenty-website-redone/package.json b/packages/twenty-website-redone/package.json deleted file mode 100644 index 801500da51..0000000000 --- a/packages/twenty-website-redone/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "twenty-website-redone", - "private": true, - "scripts": { - "dev": "npx next dev --port 3004", - "build": "npx next build", - "start": "npx next start --port 3004", - "preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview", - "deploy:dev": "opennextjs-cloudflare build && opennextjs-cloudflare deploy --env dev", - "deploy:prod": "opennextjs-cloudflare build && opennextjs-cloudflare deploy --env prod", - "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts" - }, - "dependencies": { - "@babel/runtime": "^7.27.6", - "@base-ui/react": "^1.3.0", - "@calcom/embed-react": "^1.5.3", - "@linaria/core": "^7.0.0", - "@linaria/react": "^7.0.1", - "@lingui/core": "^5.1.2", - "@lingui/react": "^5.1.2", - "@lottiefiles/dotlottie-react": "^0.18.10", - "@tabler/icons-react": "^3.41.1", - "@wyw-in-js/babel-preset": "^0.8.1", - "@wyw-in-js/transform": "^0.8.1", - "next": "^16.2.6", - "next-with-linaria": "^1.3.0", - "react": "19.2.3", - "react-dom": "19.2.3", - "server-only": "^0.0.1", - "stripe": "^20.3.1", - "three": "^0.184.0", - "twenty-shared": "workspace:*", - "twenty-ui": "workspace:*", - "zod": "^4.1.11" - }, - "devDependencies": { - "@lingui/cli": "^5.1.2", - "@lingui/conf": "5.1.2", - "@lingui/format-po": "5.1.2", - "@lingui/swc-plugin": "^5.11.0", - "@opennextjs/cloudflare": "^1.0.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "@types/three": "^0.184.1", - "jest-environment-jsdom": "30.0.0-beta.3", - "wrangler": "^4.0.0" - } -} diff --git a/packages/twenty-website-redone/project.json b/packages/twenty-website-redone/project.json deleted file mode 100644 index 9779c41f08..0000000000 --- a/packages/twenty-website-redone/project.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "twenty-website-redone", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "packages/twenty-website-redone/src", - "projectType": "application", - "tags": ["scope:website"], - "targets": { - "dev": { - "executor": "nx:run-commands", - "options": { - "cwd": "{projectRoot}", - "command": "npx next dev --port 3004" - } - }, - "build": { - "executor": "nx:run-commands", - "options": { - "cwd": "{projectRoot}", - "command": "npx next build" - } - }, - "typecheck": { - "executor": "nx:run-commands", - "dependsOn": ["^build"], - "options": { - "cwd": "{projectRoot}", - "command": "npx tsc -p tsconfig.json --noEmit" - } - }, - "test": { - "executor": "nx:run-commands", - "dependsOn": ["^build"], - "options": { - "cwd": "{projectRoot}", - "command": "npx jest --config=jest.config.mjs" - } - }, - "lint": { - "executor": "nx:run-commands", - "options": { - "cwd": "{projectRoot}", - "command": "node scripts/check-conventions.mjs && npx oxlint -c .oxlintrc.json . && npx oxfmt --check ." - }, - "configurations": { - "fix": { - "command": "npx oxfmt ." - } - }, - "dependsOn": [ - { - "projects": ["twenty-ui"], - "target": "build" - } - ] - }, - "lingui:extract": { - "executor": "nx:run-commands", - "options": { - "cwd": "{projectRoot}", - "command": "lingui extract --overwrite --clean" - } - }, - "lingui:compile": { - "executor": "nx:run-commands", - "options": { - "cwd": "{projectRoot}", - "command": "lingui compile --typescript" - } - } - } -} diff --git a/packages/twenty-website-redone/public/.well-known/microsoft-identity-association.json b/packages/twenty-website-redone/public/.well-known/microsoft-identity-association.json deleted file mode 100644 index 3bca6de211..0000000000 --- a/packages/twenty-website-redone/public/.well-known/microsoft-identity-association.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "associatedApplications": [ - { - "applicationId": "7ad664fb-ab90-4fb1-bf20-bba9cba9fc69" - }, - { - "applicationId": "d4ca5765-1a9c-4b71-b97d-4d806814f8b7" - }, - { - "applicationId": "cf541b92-f5ae-4e2b-a54e-4796ec8394e1" - } - ] -} diff --git a/packages/twenty-website-redone/public/.well-known/openai-apps-challenge b/packages/twenty-website-redone/public/.well-known/openai-apps-challenge deleted file mode 100644 index abaf3e2b1f..0000000000 --- a/packages/twenty-website-redone/public/.well-known/openai-apps-challenge +++ /dev/null @@ -1 +0,0 @@ -6-1tez_gHTN3rqJBhwcxsc6k1BM8vwglvmV7ERKHrSk diff --git a/packages/twenty-website-redone/public/.well-known/security.txt b/packages/twenty-website-redone/public/.well-known/security.txt deleted file mode 100644 index ed3495bc59..0000000000 --- a/packages/twenty-website-redone/public/.well-known/security.txt +++ /dev/null @@ -1,5 +0,0 @@ -Contact: https://github.com/twentyhq/twenty/issues/new -Contact: security@twenty.com -Preferred-Languages: en -Canonical: https://twenty.com/.well-known/security.txt -Policy: https://github.com/twentyhq/twenty/security/policy diff --git a/packages/twenty-website-redone/public/images/core/logo.svg b/packages/twenty-website-redone/public/images/core/logo.svg deleted file mode 100644 index bad18fab32..0000000000 --- a/packages/twenty-website-redone/public/images/core/logo.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/act-education.webp b/packages/twenty-website-redone/public/images/customers/case-studies/act-education.webp deleted file mode 100644 index cc9544ea33..0000000000 Binary files a/packages/twenty-website-redone/public/images/customers/case-studies/act-education.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/alternative-partners.webp b/packages/twenty-website-redone/public/images/customers/case-studies/alternative-partners.webp deleted file mode 100644 index f4bdce553a..0000000000 Binary files a/packages/twenty-website-redone/public/images/customers/case-studies/alternative-partners.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/elevate-consulting.webp b/packages/twenty-website-redone/public/images/customers/case-studies/elevate-consulting.webp deleted file mode 100644 index 616b7e7ec2..0000000000 Binary files a/packages/twenty-website-redone/public/images/customers/case-studies/elevate-consulting.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/netzero.webp b/packages/twenty-website-redone/public/images/customers/case-studies/netzero.webp deleted file mode 100644 index 2b1c985a5f..0000000000 Binary files a/packages/twenty-website-redone/public/images/customers/case-studies/netzero.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/nine-dots.webp b/packages/twenty-website-redone/public/images/customers/case-studies/nine-dots.webp deleted file mode 100644 index f663a1aca1..0000000000 Binary files a/packages/twenty-website-redone/public/images/customers/case-studies/nine-dots.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/w3villa.webp b/packages/twenty-website-redone/public/images/customers/case-studies/w3villa.webp deleted file mode 100644 index b8b280e27b..0000000000 Binary files a/packages/twenty-website-redone/public/images/customers/case-studies/w3villa.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/home/problem/monolith-problem.webp b/packages/twenty-website-redone/public/images/home/problem/monolith-problem.webp deleted file mode 100644 index 0207033279..0000000000 Binary files a/packages/twenty-website-redone/public/images/home/problem/monolith-problem.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/home/stepper/download-worker.webp b/packages/twenty-website-redone/public/images/home/stepper/download-worker.webp deleted file mode 100644 index 1a72b984b2..0000000000 Binary files a/packages/twenty-website-redone/public/images/home/stepper/download-worker.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/home/three-cards-feature/familiar-interface-gradient.webp b/packages/twenty-website-redone/public/images/home/three-cards-feature/familiar-interface-gradient.webp deleted file mode 100644 index dd61846588..0000000000 Binary files a/packages/twenty-website-redone/public/images/home/three-cards-feature/familiar-interface-gradient.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/home/three-cards-feature/fast-path-background-noise.webp b/packages/twenty-website-redone/public/images/home/three-cards-feature/fast-path-background-noise.webp deleted file mode 100644 index 7a9340aa91..0000000000 Binary files a/packages/twenty-website-redone/public/images/home/three-cards-feature/fast-path-background-noise.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/home/three-cards-feature/fast-path-gradient.webp b/packages/twenty-website-redone/public/images/home/three-cards-feature/fast-path-gradient.webp deleted file mode 100644 index 4abb69a54c..0000000000 Binary files a/packages/twenty-website-redone/public/images/home/three-cards-feature/fast-path-gradient.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/home/three-cards-feature/live-data-gradient.webp b/packages/twenty-website-redone/public/images/home/three-cards-feature/live-data-gradient.webp deleted file mode 100644 index d80d1eb787..0000000000 Binary files a/packages/twenty-website-redone/public/images/home/three-cards-feature/live-data-gradient.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/og/default.png b/packages/twenty-website-redone/public/images/og/default.png deleted file mode 100644 index 0f924eeb36..0000000000 Binary files a/packages/twenty-website-redone/public/images/og/default.png and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/pricing/plans/organization-icon.webp b/packages/twenty-website-redone/public/images/pricing/plans/organization-icon.webp deleted file mode 100644 index 65f9a6f788..0000000000 Binary files a/packages/twenty-website-redone/public/images/pricing/plans/organization-icon.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/pricing/plans/pro-icon.webp b/packages/twenty-website-redone/public/images/pricing/plans/pro-icon.webp deleted file mode 100644 index 84b03da335..0000000000 Binary files a/packages/twenty-website-redone/public/images/pricing/plans/pro-icon.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/product/demo/background.webp b/packages/twenty-website-redone/public/images/product/demo/background.webp deleted file mode 100644 index 30e570a1c9..0000000000 Binary files a/packages/twenty-website-redone/public/images/product/demo/background.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/product/stepper/background-shape.webp b/packages/twenty-website-redone/public/images/product/stepper/background-shape.webp deleted file mode 100644 index aa4d04393a..0000000000 Binary files a/packages/twenty-website-redone/public/images/product/stepper/background-shape.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/product/stepper/background.webp b/packages/twenty-website-redone/public/images/product/stepper/background.webp deleted file mode 100644 index f2c4b16be9..0000000000 Binary files a/packages/twenty-website-redone/public/images/product/stepper/background.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/book-icon.svg b/packages/twenty-website-redone/public/images/readme/book-icon.svg deleted file mode 100644 index a21bb9485e..0000000000 --- a/packages/twenty-website-redone/public/images/readme/book-icon.svg +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/code-icon.svg b/packages/twenty-website-redone/public/images/readme/code-icon.svg deleted file mode 100644 index d4c56e01bf..0000000000 --- a/packages/twenty-website-redone/public/images/readme/code-icon.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/crowdin.webp b/packages/twenty-website-redone/public/images/readme/crowdin.webp deleted file mode 100644 index 2255648c48..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/crowdin.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/discord-icon.svg b/packages/twenty-website-redone/public/images/readme/discord-icon.svg deleted file mode 100644 index 71b9fdac9e..0000000000 --- a/packages/twenty-website-redone/public/images/readme/discord-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/figma-icon.webp b/packages/twenty-website-redone/public/images/readme/figma-icon.webp deleted file mode 100644 index 366acfc1ed..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/figma-icon.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/github-cover-dark.webp b/packages/twenty-website-redone/public/images/readme/github-cover-dark.webp deleted file mode 100644 index 5fd77e5e42..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/github-cover-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/github-cover-light.webp b/packages/twenty-website-redone/public/images/readme/github-cover-light.webp deleted file mode 100644 index a8a51b1af0..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/github-cover-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/globe-icon.svg b/packages/twenty-website-redone/public/images/readme/globe-icon.svg deleted file mode 100644 index 13fbd24d57..0000000000 --- a/packages/twenty-website-redone/public/images/readme/globe-icon.svg +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/greptile.webp b/packages/twenty-website-redone/public/images/readme/greptile.webp deleted file mode 100644 index ab269df423..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/greptile.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/language-icon.svg b/packages/twenty-website-redone/public/images/readme/language-icon.svg deleted file mode 100644 index e91550ecb7..0000000000 --- a/packages/twenty-website-redone/public/images/readme/language-icon.svg +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/linkedin-icon.svg b/packages/twenty-website-redone/public/images/readme/linkedin-icon.svg deleted file mode 100644 index 5f09a9ec9b..0000000000 --- a/packages/twenty-website-redone/public/images/readme/linkedin-icon.svg +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/map-icon.svg b/packages/twenty-website-redone/public/images/readme/map-icon.svg deleted file mode 100644 index ec4b078e65..0000000000 --- a/packages/twenty-website-redone/public/images/readme/map-icon.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/message-icon.svg b/packages/twenty-website-redone/public/images/readme/message-icon.svg deleted file mode 100644 index 000a2a5745..0000000000 --- a/packages/twenty-website-redone/public/images/readme/message-icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/monitor-icon.svg b/packages/twenty-website-redone/public/images/readme/monitor-icon.svg deleted file mode 100644 index c00d29c739..0000000000 --- a/packages/twenty-website-redone/public/images/readme/monitor-icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/planner-icon.svg b/packages/twenty-website-redone/public/images/readme/planner-icon.svg deleted file mode 100644 index c6a1ad2ef6..0000000000 --- a/packages/twenty-website-redone/public/images/readme/planner-icon.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/rocket-icon.svg b/packages/twenty-website-redone/public/images/readme/rocket-icon.svg deleted file mode 100644 index ed2801e7ab..0000000000 --- a/packages/twenty-website-redone/public/images/readme/rocket-icon.svg +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/sentry.webp b/packages/twenty-website-redone/public/images/readme/sentry.webp deleted file mode 100644 index d8679cc1b4..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/sentry.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/stack-nestjs.svg b/packages/twenty-website-redone/public/images/readme/stack-nestjs.svg deleted file mode 100644 index 0eccf9f125..0000000000 --- a/packages/twenty-website-redone/public/images/readme/stack-nestjs.svg +++ /dev/null @@ -1 +0,0 @@ -NestJS \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/stack-nx.svg b/packages/twenty-website-redone/public/images/readme/stack-nx.svg deleted file mode 100644 index 03480bd647..0000000000 --- a/packages/twenty-website-redone/public/images/readme/stack-nx.svg +++ /dev/null @@ -1 +0,0 @@ -Nx \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/stack-postgresql.svg b/packages/twenty-website-redone/public/images/readme/stack-postgresql.svg deleted file mode 100644 index ef8a84efea..0000000000 --- a/packages/twenty-website-redone/public/images/readme/stack-postgresql.svg +++ /dev/null @@ -1 +0,0 @@ -PostgreSQL \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/stack-react.svg b/packages/twenty-website-redone/public/images/readme/stack-react.svg deleted file mode 100644 index 48b0c7c360..0000000000 --- a/packages/twenty-website-redone/public/images/readme/stack-react.svg +++ /dev/null @@ -1 +0,0 @@ -React \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/stack-redis.svg b/packages/twenty-website-redone/public/images/readme/stack-redis.svg deleted file mode 100644 index bd0adb694b..0000000000 --- a/packages/twenty-website-redone/public/images/readme/stack-redis.svg +++ /dev/null @@ -1 +0,0 @@ -Redis \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/stack-typescript.svg b/packages/twenty-website-redone/public/images/readme/stack-typescript.svg deleted file mode 100644 index 3610a90551..0000000000 --- a/packages/twenty-website-redone/public/images/readme/stack-typescript.svg +++ /dev/null @@ -1 +0,0 @@ -TypeScript \ No newline at end of file diff --git a/packages/twenty-website-redone/public/images/readme/star-icon.svg b/packages/twenty-website-redone/public/images/readme/star-icon.svg deleted file mode 100644 index ce8149fa17..0000000000 --- a/packages/twenty-website-redone/public/images/readme/star-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/readme/v2-ai-agents-dark.webp b/packages/twenty-website-redone/public/images/readme/v2-ai-agents-dark.webp deleted file mode 100644 index d17740e6a4..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-ai-agents-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-ai-agents-light.webp b/packages/twenty-website-redone/public/images/readme/v2-ai-agents-light.webp deleted file mode 100644 index ff7767181d..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-ai-agents-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-all-tools-dark.webp b/packages/twenty-website-redone/public/images/readme/v2-all-tools-dark.webp deleted file mode 100644 index ca7589db68..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-all-tools-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-all-tools-light.webp b/packages/twenty-website-redone/public/images/readme/v2-all-tools-light.webp deleted file mode 100644 index 679090dad1..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-all-tools-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-build-apps-dark.webp b/packages/twenty-website-redone/public/images/readme/v2-build-apps-dark.webp deleted file mode 100644 index 9f93b1e62c..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-build-apps-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-build-apps-light.webp b/packages/twenty-website-redone/public/images/readme/v2-build-apps-light.webp deleted file mode 100644 index 8e2c962847..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-build-apps-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-crm-tools-dark.webp b/packages/twenty-website-redone/public/images/readme/v2-crm-tools-dark.webp deleted file mode 100644 index 627ed655bc..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-crm-tools-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-crm-tools-light.webp b/packages/twenty-website-redone/public/images/readme/v2-crm-tools-light.webp deleted file mode 100644 index dd54c06813..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-crm-tools-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-tools-dark.webp b/packages/twenty-website-redone/public/images/readme/v2-tools-dark.webp deleted file mode 100644 index 4851348b52..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-tools-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-tools-light.webp b/packages/twenty-website-redone/public/images/readme/v2-tools-light.webp deleted file mode 100644 index bf3b882788..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-tools-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-version-control-dark.webp b/packages/twenty-website-redone/public/images/readme/v2-version-control-dark.webp deleted file mode 100644 index a99d790c6b..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-version-control-dark.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/v2-version-control-light.webp b/packages/twenty-website-redone/public/images/readme/v2-version-control-light.webp deleted file mode 100644 index 324f025d6a..0000000000 Binary files a/packages/twenty-website-redone/public/images/readme/v2-version-control-light.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/readme/x-icon.svg b/packages/twenty-website-redone/public/images/readme/x-icon.svg deleted file mode 100644 index 47d6b9f178..0000000000 --- a/packages/twenty-website-redone/public/images/readme/x-icon.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/packages/twenty-website-redone/public/images/releases/0.10/0.10-currency.webp b/packages/twenty-website-redone/public/images/releases/0.10/0.10-currency.webp deleted file mode 100644 index f844ceefb9..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.10/0.10-currency.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.10/0.10-datetime.webp b/packages/twenty-website-redone/public/images/releases/0.10/0.10-datetime.webp deleted file mode 100644 index 0d9a91d706..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.10/0.10-datetime.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.10/0.10-json.webp b/packages/twenty-website-redone/public/images/releases/0.10/0.10-json.webp deleted file mode 100644 index 77b7b416e8..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.10/0.10-json.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.10/0.10-multi-select.webp b/packages/twenty-website-redone/public/images/releases/0.10/0.10-multi-select.webp deleted file mode 100644 index 2f143f224b..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.10/0.10-multi-select.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.11/0.11-calendar.webp b/packages/twenty-website-redone/public/images/releases/0.11/0.11-calendar.webp deleted file mode 100644 index e94ff9e3c9..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.11/0.11-calendar.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.11/0.11-speed.webp b/packages/twenty-website-redone/public/images/releases/0.11/0.11-speed.webp deleted file mode 100644 index ba50807898..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.11/0.11-speed.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.12/0.12-database-diagram.webp b/packages/twenty-website-redone/public/images/releases/0.12/0.12-database-diagram.webp deleted file mode 100644 index 9e122faee4..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.12/0.12-database-diagram.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.12/0.12-link-field.webp b/packages/twenty-website-redone/public/images/releases/0.12/0.12-link-field.webp deleted file mode 100644 index 17f9beb220..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.12/0.12-link-field.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.12/0.12-loader.webp b/packages/twenty-website-redone/public/images/releases/0.12/0.12-loader.webp deleted file mode 100644 index bf16273f51..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.12/0.12-loader.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.12/0.12-notifications.webp b/packages/twenty-website-redone/public/images/releases/0.12/0.12-notifications.webp deleted file mode 100644 index c9986e9c86..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.12/0.12-notifications.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.2.3_relations.webp b/packages/twenty-website-redone/public/images/releases/0.2.3_relations.webp deleted file mode 100644 index f0ed2e4fe5..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.2.3_relations.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.2.3_webhooks.webp b/packages/twenty-website-redone/public/images/releases/0.2.3_webhooks.webp deleted file mode 100644 index 9573a4a007..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.2.3_webhooks.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.20/0.20-blocklist.webp b/packages/twenty-website-redone/public/images/releases/0.20/0.20-blocklist.webp deleted file mode 100644 index 02f9400ae0..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.20/0.20-blocklist.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.20/0.20-onboarding.webp b/packages/twenty-website-redone/public/images/releases/0.20/0.20-onboarding.webp deleted file mode 100644 index 43bc536e20..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.20/0.20-onboarding.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.20/0.20-timeline.webp b/packages/twenty-website-redone/public/images/releases/0.20/0.20-timeline.webp deleted file mode 100644 index 95cd555e3a..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.20/0.20-timeline.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.21/0.21-advanced-email-settings.webp b/packages/twenty-website-redone/public/images/releases/0.21/0.21-advanced-email-settings.webp deleted file mode 100644 index c87e6eaf94..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.21/0.21-advanced-email-settings.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.21/0.21-many-many.webp b/packages/twenty-website-redone/public/images/releases/0.21/0.21-many-many.webp deleted file mode 100644 index 7200508a47..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.21/0.21-many-many.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.22/0.22-kanban-improvements.webp b/packages/twenty-website-redone/public/images/releases/0.22/0.22-kanban-improvements.webp deleted file mode 100644 index 5ab574d7ba..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.22/0.22-kanban-improvements.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.22/0.22-mass-deletion.webp b/packages/twenty-website-redone/public/images/releases/0.22/0.22-mass-deletion.webp deleted file mode 100644 index 0923d79934..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.22/0.22-mass-deletion.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.22/0.22-navbar.webp b/packages/twenty-website-redone/public/images/releases/0.22/0.22-navbar.webp deleted file mode 100644 index 45ff9b809d..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.22/0.22-navbar.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.23/0.23-created-by.webp b/packages/twenty-website-redone/public/images/releases/0.23/0.23-created-by.webp deleted file mode 100644 index 0054b6dbaa..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.23/0.23-created-by.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.23/0.23-filter-webhooks.webp b/packages/twenty-website-redone/public/images/releases/0.23/0.23-filter-webhooks.webp deleted file mode 100644 index 4b7327124e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.23/0.23-filter-webhooks.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.23/0.23-notes-tasks.webp b/packages/twenty-website-redone/public/images/releases/0.23/0.23-notes-tasks.webp deleted file mode 100644 index d0df8d8e9a..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.23/0.23-notes-tasks.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.24/0.24-soft-delete.webp b/packages/twenty-website-redone/public/images/releases/0.24/0.24-soft-delete.webp deleted file mode 100644 index 5c3087a3bb..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.24/0.24-soft-delete.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.3.0_rating.webp b/packages/twenty-website-redone/public/images/releases/0.3.0_rating.webp deleted file mode 100644 index 2d7e610e1f..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.3.0_rating.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.3.1_contributors.webp b/packages/twenty-website-redone/public/images/releases/0.3.1_contributors.webp deleted file mode 100644 index fbf77fbdb5..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.3.1_contributors.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.3.2_new_layout.webp b/packages/twenty-website-redone/public/images/releases/0.3.2_new_layout.webp deleted file mode 100644 index 865e6a2341..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.3.2_new_layout.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.3.3_emails.webp b/packages/twenty-website-redone/public/images/releases/0.3.3_emails.webp deleted file mode 100644 index 4b4efe9eeb..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.3.3_emails.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.3.3_kanban.webp b/packages/twenty-website-redone/public/images/releases/0.3.3_kanban.webp deleted file mode 100644 index 4b1de10ba1..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.3.3_kanban.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.3.3_sign_up.webp b/packages/twenty-website-redone/public/images/releases/0.3.3_sign_up.webp deleted file mode 100644 index b7a0b37793..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.3.3_sign_up.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.30/0.30-array-field.webp b/packages/twenty-website-redone/public/images/releases/0.30/0.30-array-field.webp deleted file mode 100644 index db9ad9d8b8..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.30/0.30-array-field.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.30/0.30-emails.webp b/packages/twenty-website-redone/public/images/releases/0.30/0.30-emails.webp deleted file mode 100644 index 51fffd30b3..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.30/0.30-emails.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.30/0.30-new-settings.webp b/packages/twenty-website-redone/public/images/releases/0.30/0.30-new-settings.webp deleted file mode 100644 index 4529459509..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.30/0.30-new-settings.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.31/0.31-advanced-settings.webp b/packages/twenty-website-redone/public/images/releases/0.31/0.31-advanced-settings.webp deleted file mode 100644 index d3b72ae731..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.31/0.31-advanced-settings.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.31/0.31-search.webp b/packages/twenty-website-redone/public/images/releases/0.31/0.31-search.webp deleted file mode 100644 index 9bd451f23d..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.31/0.31-search.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.32/0.32-improved-cmdk.webp b/packages/twenty-website-redone/public/images/releases/0.32/0.32-improved-cmdk.webp deleted file mode 100644 index ada0f4dea3..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.32/0.32-improved-cmdk.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.32/0.32-webhooks.webp b/packages/twenty-website-redone/public/images/releases/0.32/0.32-webhooks.webp deleted file mode 100644 index 9b7303c6dd..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.32/0.32-webhooks.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.33/0.33-multiselect-filter.webp b/packages/twenty-website-redone/public/images/releases/0.33/0.33-multiselect-filter.webp deleted file mode 100644 index 0bb4bdaf06..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.33/0.33-multiselect-filter.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.33/0.33-percentage-number.webp b/packages/twenty-website-redone/public/images/releases/0.33/0.33-percentage-number.webp deleted file mode 100644 index a34fd338dd..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.33/0.33-percentage-number.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.34/0.34-subdomains.webp b/packages/twenty-website-redone/public/images/releases/0.34/0.34-subdomains.webp deleted file mode 100644 index 85aa3602f8..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.34/0.34-subdomains.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.35/0.35-Favorites.webp b/packages/twenty-website-redone/public/images/releases/0.35/0.35-Favorites.webp deleted file mode 100644 index 283626a5ed..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.35/0.35-Favorites.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.4/0.4-address-field-type.webp b/packages/twenty-website-redone/public/images/releases/0.4/0.4-address-field-type.webp deleted file mode 100644 index 688268f252..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.4/0.4-address-field-type.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.4/0.4-expand-relation-card.webp b/packages/twenty-website-redone/public/images/releases/0.4/0.4-expand-relation-card.webp deleted file mode 100644 index 34f831a842..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.4/0.4-expand-relation-card.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.4/0.4-multi-workspace.webp b/packages/twenty-website-redone/public/images/releases/0.4/0.4-multi-workspace.webp deleted file mode 100644 index c7f72a2706..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.4/0.4-multi-workspace.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.40/0.40-aggregates.webp b/packages/twenty-website-redone/public/images/releases/0.40/0.40-aggregates.webp deleted file mode 100644 index 75b6accfd6..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.40/0.40-aggregates.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.40/0.40-group-by.webp b/packages/twenty-website-redone/public/images/releases/0.40/0.40-group-by.webp deleted file mode 100644 index 6bad36ac83..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.40/0.40-group-by.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.41/0.41-labs.webp b/packages/twenty-website-redone/public/images/releases/0.41/0.41-labs.webp deleted file mode 100644 index 3c2fc9d44f..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.41/0.41-labs.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.42/0.42-document-viewer.webp b/packages/twenty-website-redone/public/images/releases/0.42/0.42-document-viewer.webp deleted file mode 100644 index afc91bc33b..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.42/0.42-document-viewer.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.42/0.42-microsoft.webp b/packages/twenty-website-redone/public/images/releases/0.42/0.42-microsoft.webp deleted file mode 100644 index c328bac5b9..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.42/0.42-microsoft.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.42/0.42-translation.webp b/packages/twenty-website-redone/public/images/releases/0.42/0.42-translation.webp deleted file mode 100644 index 0446f1d0b5..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.42/0.42-translation.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.43.0/email-privacy.webp b/packages/twenty-website-redone/public/images/releases/0.43.0/email-privacy.webp deleted file mode 100644 index 28df356938..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.43.0/email-privacy.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.43.0/search-upgrade.webp b/packages/twenty-website-redone/public/images/releases/0.43.0/search-upgrade.webp deleted file mode 100644 index 73efac4432..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.43.0/search-upgrade.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.44/0.44-admin-panel.webp b/packages/twenty-website-redone/public/images/releases/0.44/0.44-admin-panel.webp deleted file mode 100644 index fd964efb5d..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.44/0.44-admin-panel.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.44/0.44-side-panel.webp b/packages/twenty-website-redone/public/images/releases/0.44/0.44-side-panel.webp deleted file mode 100644 index 8994228076..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.44/0.44-side-panel.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.50/0.50-advanced-filters.webp b/packages/twenty-website-redone/public/images/releases/0.50/0.50-advanced-filters.webp deleted file mode 100644 index 67d622f2cb..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.50/0.50-advanced-filters.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.50/0.50-permissions.webp b/packages/twenty-website-redone/public/images/releases/0.50/0.50-permissions.webp deleted file mode 100644 index 436c258837..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.50/0.50-permissions.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.51.0/0.51-options-menu.webp b/packages/twenty-website-redone/public/images/releases/0.51.0/0.51-options-menu.webp deleted file mode 100644 index 85e240ad63..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.51.0/0.51-options-menu.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.52.0/0.52-custom-date-format.webp b/packages/twenty-website-redone/public/images/releases/0.52.0/0.52-custom-date-format.webp deleted file mode 100644 index 0451626c76..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.52.0/0.52-custom-date-format.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.52.0/0.52-filtered-views-records.webp b/packages/twenty-website-redone/public/images/releases/0.52.0/0.52-filtered-views-records.webp deleted file mode 100644 index a4b76a3cab..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/0.52.0/0.52-filtered-views-records.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.00/1.00-import-update.webp b/packages/twenty-website-redone/public/images/releases/1.00/1.00-import-update.webp deleted file mode 100644 index 7669c53ddb..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.00/1.00-import-update.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.00/1.00-performance-improvement.webp b/packages/twenty-website-redone/public/images/releases/1.00/1.00-performance-improvement.webp deleted file mode 100644 index 6b632bb856..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.00/1.00-performance-improvement.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.00/1.00-permissions.webp b/packages/twenty-website-redone/public/images/releases/1.00/1.00-permissions.webp deleted file mode 100644 index a3e0f21c8c..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.00/1.00-permissions.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.00/1.00-subfield-filtering.webp b/packages/twenty-website-redone/public/images/releases/1.00/1.00-subfield-filtering.webp deleted file mode 100644 index 0c4e33988c..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.00/1.00-subfield-filtering.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.00/1.00-workflow.webp b/packages/twenty-website-redone/public/images/releases/1.00/1.00-workflow.webp deleted file mode 100644 index 7bec4bda48..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.00/1.00-workflow.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.1/1.1-multi-manual-trigger.webp b/packages/twenty-website-redone/public/images/releases/1.1/1.1-multi-manual-trigger.webp deleted file mode 100644 index 4bf13fe68e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.1/1.1-multi-manual-trigger.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.10/1.10.0-calendar.webp b/packages/twenty-website-redone/public/images/releases/1.10/1.10.0-calendar.webp deleted file mode 100644 index be7afd9863..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.10/1.10.0-calendar.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.10/1.10.0-dashboards.webp b/packages/twenty-website-redone/public/images/releases/1.10/1.10.0-dashboards.webp deleted file mode 100644 index caf52b8982..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.10/1.10.0-dashboards.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.11/1.11.0-morph-relations.webp b/packages/twenty-website-redone/public/images/releases/1.11/1.11.0-morph-relations.webp deleted file mode 100644 index 4578f8275e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.11/1.11.0-morph-relations.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.11/1.11.0-unlisted-views.webp b/packages/twenty-website-redone/public/images/releases/1.11/1.11.0-unlisted-views.webp deleted file mode 100644 index c3da1776b0..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.11/1.11.0-unlisted-views.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.12/1.12.0-folder-sync.webp b/packages/twenty-website-redone/public/images/releases/1.12/1.12.0-folder-sync.webp deleted file mode 100644 index db9270d7c5..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.12/1.12.0-folder-sync.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.12/1.12.0-side-panel.webp b/packages/twenty-website-redone/public/images/releases/1.12/1.12.0-side-panel.webp deleted file mode 100644 index d63c574a01..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.12/1.12.0-side-panel.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.13/1.13.0-stop-workflow-button.webp b/packages/twenty-website-redone/public/images/releases/1.13/1.13.0-stop-workflow-button.webp deleted file mode 100644 index 18fc466d98..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.13/1.13.0-stop-workflow-button.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp b/packages/twenty-website-redone/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp deleted file mode 100644 index 61fae0e11a..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.15/1.15.0-updated-by-official.webp b/packages/twenty-website-redone/public/images/releases/1.15/1.15.0-updated-by-official.webp deleted file mode 100644 index 03cbf3f29e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.15/1.15.0-updated-by-official.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.16/1.16.0-files-in-records.webp b/packages/twenty-website-redone/public/images/releases/1.16/1.16.0-files-in-records.webp deleted file mode 100644 index 468eca4078..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.16/1.16.0-files-in-records.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.16/1.16.0-flexible-relations.webp b/packages/twenty-website-redone/public/images/releases/1.16/1.16.0-flexible-relations.webp deleted file mode 100644 index 20ed4b42d7..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.16/1.16.0-flexible-relations.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.17/1.17.0-ai-chat.webp b/packages/twenty-website-redone/public/images/releases/1.17/1.17.0-ai-chat.webp deleted file mode 100644 index d858aedd81..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.17/1.17.0-ai-chat.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.18/1.18.0-live-updates.webp b/packages/twenty-website-redone/public/images/releases/1.18/1.18.0-live-updates.webp deleted file mode 100644 index 7fa22798f2..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.18/1.18.0-live-updates.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.18/1.18.0-sidebar-items.webp b/packages/twenty-website-redone/public/images/releases/1.18/1.18.0-sidebar-items.webp deleted file mode 100644 index 9027c3cceb..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.18/1.18.0-sidebar-items.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.19/1.19.0-invite-roles.webp b/packages/twenty-website-redone/public/images/releases/1.19/1.19.0-invite-roles.webp deleted file mode 100644 index 389ca32fdf..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.19/1.19.0-invite-roles.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.2/1.2-any-fields.webp b/packages/twenty-website-redone/public/images/releases/1.2/1.2-any-fields.webp deleted file mode 100644 index 6d6ffaee2e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.2/1.2-any-fields.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.2/1.2-import-relations.webp b/packages/twenty-website-redone/public/images/releases/1.2/1.2-import-relations.webp deleted file mode 100644 index 686533f1da..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.2/1.2-import-relations.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.20/1.20.0-easier-field-editing.webp b/packages/twenty-website-redone/public/images/releases/1.20/1.20.0-easier-field-editing.webp deleted file mode 100644 index f237e7f40b..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.20/1.20.0-easier-field-editing.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.20/1.20.0-field-widgets.webp b/packages/twenty-website-redone/public/images/releases/1.20/1.20.0-field-widgets.webp deleted file mode 100644 index 0d59358f32..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.20/1.20.0-field-widgets.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.21/1.21.0-email-replies.webp b/packages/twenty-website-redone/public/images/releases/1.21/1.21.0-email-replies.webp deleted file mode 100644 index a5c1fe257f..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.21/1.21.0-email-replies.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.21/1.21.0-maintenance-mode.webp b/packages/twenty-website-redone/public/images/releases/1.21/1.21.0-maintenance-mode.webp deleted file mode 100644 index 3ff8ad2536..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.21/1.21.0-maintenance-mode.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.22/1.22.0-rich-text-layouts.webp b/packages/twenty-website-redone/public/images/releases/1.22/1.22.0-rich-text-layouts.webp deleted file mode 100644 index 809c61a63e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.22/1.22.0-rich-text-layouts.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.23/1.23.0-easier-layouts.webp b/packages/twenty-website-redone/public/images/releases/1.23/1.23.0-easier-layouts.webp deleted file mode 100644 index 982a89fa49..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.23/1.23.0-easier-layouts.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.3/1.3-IMAP.webp b/packages/twenty-website-redone/public/images/releases/1.3/1.3-IMAP.webp deleted file mode 100644 index 6263a77305..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.3/1.3-IMAP.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.3/1.3-merge.webp b/packages/twenty-website-redone/public/images/releases/1.3/1.3-merge.webp deleted file mode 100644 index 529721c1ac..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.3/1.3-merge.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.4/1.4-field-permissions.webp b/packages/twenty-website-redone/public/images/releases/1.4/1.4-field-permissions.webp deleted file mode 100644 index 75da4606a0..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.4/1.4-field-permissions.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.4/1.4-two-factor-auth.webp b/packages/twenty-website-redone/public/images/releases/1.4/1.4-two-factor-auth.webp deleted file mode 100644 index 89c9704d65..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.4/1.4-two-factor-auth.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.4/1.4-workflow-filters.webp b/packages/twenty-website-redone/public/images/releases/1.4/1.4-workflow-filters.webp deleted file mode 100644 index ae4e2f4942..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.4/1.4-workflow-filters.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.5/1.5-workflow-branches.webp b/packages/twenty-website-redone/public/images/releases/1.5/1.5-workflow-branches.webp deleted file mode 100644 index f2e0b81446..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.5/1.5-workflow-branches.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.6/1.6-workflows-improvements.webp b/packages/twenty-website-redone/public/images/releases/1.6/1.6-workflows-improvements.webp deleted file mode 100644 index 77a2d64d93..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.6/1.6-workflows-improvements.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.7/1.7-impersonating.webp b/packages/twenty-website-redone/public/images/releases/1.7/1.7-impersonating.webp deleted file mode 100644 index e6b3c23905..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.7/1.7-impersonating.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.7/1.7-upsert.webp b/packages/twenty-website-redone/public/images/releases/1.7/1.7-upsert.webp deleted file mode 100644 index 7594e7eb6e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.7/1.7-upsert.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.8/1.8-bulk-select.webp b/packages/twenty-website-redone/public/images/releases/1.8/1.8-bulk-select.webp deleted file mode 100644 index 0d714fd21c..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.8/1.8-bulk-select.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.8/1.8-search-limit.webp b/packages/twenty-website-redone/public/images/releases/1.8/1.8-search-limit.webp deleted file mode 100644 index 1d7359918e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.8/1.8-search-limit.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/1.8/1.8-workflow-iterator.webp b/packages/twenty-website-redone/public/images/releases/1.8/1.8-workflow-iterator.webp deleted file mode 100644 index b2d64a112e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/1.8/1.8-workflow-iterator.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-ai.webp b/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-ai.webp deleted file mode 100644 index 4a32968445..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-ai.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-build-anything.webp b/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-build-anything.webp deleted file mode 100644 index 106ad45b4d..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-build-anything.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-build-with-tools.webp b/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-build-with-tools.webp deleted file mode 100644 index 8c53fe8494..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-build-with-tools.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-custom-layouts.webp b/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-custom-layouts.webp deleted file mode 100644 index 1ee2dfdd0e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-custom-layouts.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-version-control.webp b/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-version-control.webp deleted file mode 100644 index c67545d38e..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/2.0/2.0.0-version-control.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/labs/translation.webp b/packages/twenty-website-redone/public/images/releases/labs/translation.webp deleted file mode 100644 index 4541612e43..0000000000 Binary files a/packages/twenty-website-redone/public/images/releases/labs/translation.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/accel.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/accel.webp deleted file mode 100644 index 7e61057680..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/accel.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/airbnb.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/airbnb.webp deleted file mode 100644 index 2c9fa7324f..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/airbnb.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/anthropic.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/anthropic.webp deleted file mode 100644 index 9156a40778..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/anthropic.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/cursor.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/cursor.webp deleted file mode 100644 index a531ddf91c..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/cursor.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/figma.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/figma.webp deleted file mode 100644 index ede071c202..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/figma.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/github.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/github.webp deleted file mode 100644 index df3c08d959..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/github.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/google.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/google.webp deleted file mode 100644 index a56243b0bd..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/google.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/linear.svg b/packages/twenty-website-redone/public/images/shared/companies/logos/linear.svg deleted file mode 100644 index 8147bdefa2..0000000000 --- a/packages/twenty-website-redone/public/images/shared/companies/logos/linear.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/linkedin.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/linkedin.webp deleted file mode 100644 index a9c994ce68..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/linkedin.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/mailchimp.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/mailchimp.webp deleted file mode 100644 index 7bc14f1c10..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/mailchimp.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/notion.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/notion.webp deleted file mode 100644 index c4118c38a3..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/notion.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/sequoia.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/sequoia.webp deleted file mode 100644 index bb3f60aca1..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/sequoia.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/slack.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/slack.webp deleted file mode 100644 index 68c4424b38..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/slack.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/stripe.webp b/packages/twenty-website-redone/public/images/shared/companies/logos/stripe.webp deleted file mode 100644 index a2a65a1045..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/companies/logos/stripe.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/halftone/twenty-logo.svg b/packages/twenty-website-redone/public/images/shared/halftone/twenty-logo.svg deleted file mode 100644 index b3086be88e..0000000000 --- a/packages/twenty-website-redone/public/images/shared/halftone/twenty-logo.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/packages/twenty-website-redone/public/images/shared/light-noise.webp b/packages/twenty-website-redone/public/images/shared/light-noise.webp deleted file mode 100644 index 566a5da51b..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/light-noise.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-felix.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-felix.webp deleted file mode 100644 index e8ce7605af..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-felix.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-indira.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-indira.webp deleted file mode 100644 index c351b70f86..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-indira.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-laura.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-laura.webp deleted file mode 100644 index edc9b1e221..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-laura.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-mike.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-mike.webp deleted file mode 100644 index 0c38085fc0..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-mike.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-thomas.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-thomas.webp deleted file mode 100644 index 79fc11a8d8..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/anonymous-thomas.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/ben-chestnut.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/ben-chestnut.webp deleted file mode 100644 index 68985a00ab..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/ben-chestnut.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/brian-chesky.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/brian-chesky.webp deleted file mode 100644 index db95480be0..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/brian-chesky.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/chris-wanstrath.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/chris-wanstrath.webp deleted file mode 100644 index 54b2de4f4f..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/chris-wanstrath.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/dario-amodei.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/dario-amodei.webp deleted file mode 100644 index fb708daf8b..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/dario-amodei.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/dylan-field.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/dylan-field.webp deleted file mode 100644 index dd6af85617..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/dylan-field.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/eddy-cue.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/eddy-cue.webp deleted file mode 100644 index 486ce5a535..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/eddy-cue.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/ivan-zhao.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/ivan-zhao.webp deleted file mode 100644 index a27d6ad93e..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/ivan-zhao.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/jeff-williams.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/jeff-williams.webp deleted file mode 100644 index cf14da400b..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/jeff-williams.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/joe-gebbia.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/joe-gebbia.webp deleted file mode 100644 index f1de37b2bc..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/joe-gebbia.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/katherine-adams.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/katherine-adams.webp deleted file mode 100644 index e18ac3037e..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/katherine-adams.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/patrick-collison.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/patrick-collison.webp deleted file mode 100644 index 1ad15e6b8b..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/patrick-collison.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/peter-reinhardt.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/peter-reinhardt.webp deleted file mode 100644 index 5a2d4fa192..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/peter-reinhardt.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/peter-thiel.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/peter-thiel.webp deleted file mode 100644 index cddd929e0f..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/peter-thiel.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/ping-li.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/ping-li.webp deleted file mode 100644 index 9eeb3d9592..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/ping-li.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/ray-damm.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/ray-damm.webp deleted file mode 100644 index dc65b2e1cd..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/ray-damm.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/reid-hoffman.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/reid-hoffman.webp deleted file mode 100644 index 8ce8b887bf..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/reid-hoffman.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/roelof-botha.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/roelof-botha.webp deleted file mode 100644 index 18c392f008..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/roelof-botha.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/ryan-roslansky.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/ryan-roslansky.webp deleted file mode 100644 index 449311bae2..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/ryan-roslansky.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/stewart-butterfield.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/stewart-butterfield.webp deleted file mode 100644 index f35c93b849..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/stewart-butterfield.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/sundar-pichai.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/sundar-pichai.webp deleted file mode 100644 index 4d852dc83b..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/sundar-pichai.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/people/avatars/thomas-dohmke.webp b/packages/twenty-website-redone/public/images/shared/people/avatars/thomas-dohmke.webp deleted file mode 100644 index 60b0b5b363..0000000000 Binary files a/packages/twenty-website-redone/public/images/shared/people/avatars/thomas-dohmke.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/why-twenty/hero/background.webp b/packages/twenty-website-redone/public/images/why-twenty/hero/background.webp deleted file mode 100644 index 58fda20d4e..0000000000 Binary files a/packages/twenty-website-redone/public/images/why-twenty/hero/background.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/lottie/stepper/stepper.lottie b/packages/twenty-website-redone/public/lottie/stepper/stepper.lottie deleted file mode 100644 index 006eacb859..0000000000 Binary files a/packages/twenty-website-redone/public/lottie/stepper/stepper.lottie and /dev/null differ diff --git a/packages/twenty-website-redone/src/app/[locale]/halftone/page.tsx b/packages/twenty-website-redone/src/app/[locale]/halftone/page.tsx deleted file mode 100644 index 9bce848ca2..0000000000 --- a/packages/twenty-website-redone/src/app/[locale]/halftone/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { - getRouteI18n, - type LocaleRouteParams, -} from '@/platform/i18n/get-route-i18n'; -import { buildRouteMetadata } from '@/platform/seo'; -import { HalftoneStudioMount } from '@/platform/visuals/halftone-studio/studio/HalftoneStudioMount'; - -export const generateMetadata = buildRouteMetadata('halftone'); - -// Internal dev tool: noindex via the route registry record. The studio mounts -// client-only behind a dynamic(ssr:false) boundary, so three never enters any -// initial chunk. -export default async function HalftonePage({ - params, -}: { - params: Promise; -}) { - await getRouteI18n(params); - - return ; -} diff --git a/packages/twenty-website-redone/src/app/[locale]/layout.tsx b/packages/twenty-website-redone/src/app/[locale]/layout.tsx deleted file mode 100644 index dd1bbbea88..0000000000 --- a/packages/twenty-website-redone/src/app/[locale]/layout.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { css } from '@linaria/core'; -import { Aleo, Azeret_Mono, Host_Grotesk, VT323 } from 'next/font/google'; -import { type ReactNode } from 'react'; - -import { getLocaleMessages } from '@/platform/i18n/get-locale-messages'; -import { - getRouteI18n, - type LocaleRouteParams, -} from '@/platform/i18n/get-route-i18n'; -import { ContactCalModalRoot } from '@/contact-cal'; -import { I18nProvider } from '@/platform/i18n/I18nProvider'; -import { localeToUrlSegment } from '@/platform/i18n/locale-to-url-segment'; -import { resolveLocaleParam } from '@/platform/i18n/resolve-locale-param'; -import { WEBSITE_LOCALE_LIST } from '@/platform/i18n/website-locale-list'; -import { color, fontFamily, tokenCssVariables } from '@/tokens'; - -const hostGrotesk = Host_Grotesk({ - subsets: ['latin'], - weight: ['300', '400', '500', '600'], - variable: '--font-sans', - display: 'swap', -}); - -const aleo = Aleo({ - subsets: ['latin'], - weight: ['300'], - variable: '--font-serif', - display: 'swap', -}); - -const azeretMono = Azeret_Mono({ - subsets: ['latin'], - weight: ['300', '500'], - variable: '--font-mono', - display: 'swap', -}); - -const vt323 = VT323({ - subsets: ['latin'], - weight: '400', - variable: '--font-retro', - display: 'swap', -}); - -const globalStyles = css` - /* One root rule instead of per-component guards: motion collapses to - instant for users who prefer reduced motion. State still applies; - only the travel disappears. */ - @media (prefers-reduced-motion: reduce) { - *, - *::before, - *::after { - animation-duration: 0.01ms !important; - transition-duration: 0.01ms !important; - } - } - - :global(*), - :global(*::before), - :global(*::after) { - box-sizing: border-box; - margin: 0; - padding: 0; - } - - :global(body) { - background-color: ${color('white')}; - color: ${color('black')}; - font-family: ${fontFamily('sans')}; - min-height: 100vh; - min-height: 100dvh; - -webkit-font-smoothing: antialiased; - } -`; - -export const dynamicParams = false; - -export const generateStaticParams = (): LocaleRouteParams[] => - WEBSITE_LOCALE_LIST.map((locale) => ({ - locale: localeToUrlSegment(locale), - })); - -const LocaleLayout = async ({ - children, - params, -}: { - children: ReactNode; - params: Promise; -}) => { - await getRouteI18n(params); - const locale = resolveLocaleParam((await params).locale); - - return ( - - - - {children} - - - - ); -}; - -export default LocaleLayout; diff --git a/packages/twenty-website-redone/src/app/api/enterprise/activate/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/activate/route.ts deleted file mode 100644 index ef0a58d069..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/activate/route.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { - getLicenseeFromStripeCustomer, - getStripeClient, - signEnterpriseKey, -} from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -export async function GET(request: Request) { - if ( - !process.env.STRIPE_SECRET_KEY || - !process.env.ENTERPRISE_JWT_PRIVATE_KEY - ) { - console.error( - '[enterprise-activate] 503 — STRIPE_SECRET_KEY and/or ENTERPRISE_JWT_PRIVATE_KEY are not configured', - ); - return NextResponse.json( - { error: 'Enterprise activation is not configured.' }, - { status: 503 }, - ); - } - - try { - const sessionId = new URL(request.url).searchParams.get('session_id'); - - if (!sessionId) { - return NextResponse.json( - { error: 'Missing session_id parameter' }, - { status: 400 }, - ); - } - - const stripe = getStripeClient(); - const session = await stripe.checkout.sessions.retrieve(sessionId, { - expand: ['subscription', 'customer'], - }); - - const SUCCESSFUL_PAYMENT_STATUSES: Array = [ - 'paid', - 'no_payment_required', - ]; - - if ( - session.status !== 'complete' || - !SUCCESSFUL_PAYMENT_STATUSES.includes(session.payment_status) - ) { - return NextResponse.json( - { error: 'Checkout session is not completed' }, - { status: 402 }, - ); - } - - const subscription = session.subscription; - - if (!subscription || typeof subscription === 'string') { - return NextResponse.json( - { error: 'Subscription not found' }, - { status: 400 }, - ); - } - - const ACTIVATABLE_SUBSCRIPTION_STATUSES: Array = - ['active', 'trialing']; - - if (!ACTIVATABLE_SUBSCRIPTION_STATUSES.includes(subscription.status)) { - return NextResponse.json( - { error: 'Subscription is not active', status: subscription.status }, - { status: 402 }, - ); - } - - const licensee = getLicenseeFromStripeCustomer(session.customer); - - const enterpriseKey = signEnterpriseKey(subscription.id, licensee); - - return NextResponse.json({ - enterpriseKey, - licensee, - subscriptionId: subscription.id, - }); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : 'Unknown error'; - - return NextResponse.json( - { error: `Activation error: ${message}` }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/enterprise/checkout/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/checkout/route.ts deleted file mode 100644 index 52f4bb709c..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/checkout/route.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { getEnterprisePriceId, getStripeClient } from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -export async function POST(request: Request) { - if (!process.env.STRIPE_SECRET_KEY) { - console.error( - '[enterprise-checkout] 503 — STRIPE_SECRET_KEY is not configured', - ); - return NextResponse.json( - { error: 'Enterprise checkout is not configured.' }, - { status: 503 }, - ); - } - - try { - const stripe = getStripeClient(); - const body = (await request.json()) as { - billingInterval?: unknown; - seatCount?: unknown; - successUrl?: unknown; - }; - - const billingInterval = - body.billingInterval === 'yearly' ? 'yearly' : 'monthly'; - const priceId = getEnterprisePriceId(billingInterval); - const websiteUrl = process.env.NEXT_PUBLIC_WEBSITE_URL; - const defaultSuccessUrl = websiteUrl - ? `${websiteUrl}/enterprise/activate?session_id={CHECKOUT_SESSION_ID}` - : undefined; - const successUrl = - typeof body.successUrl === 'string' ? body.successUrl : defaultSuccessUrl; - - if (!successUrl) { - return NextResponse.json( - { - error: - 'Missing successUrl or NEXT_PUBLIC_WEBSITE_URL for checkout redirect', - }, - { status: 500 }, - ); - } - - const seatCount = - typeof body.seatCount === 'number' && body.seatCount >= 1 - ? body.seatCount - : 1; - - const session = await stripe.checkout.sessions.create({ - mode: 'subscription', - line_items: [ - { - price: priceId, - quantity: seatCount, - }, - ], - success_url: successUrl, - subscription_data: { - trial_period_days: 30, - metadata: { - source: 'enterprise-self-hosted', - }, - }, - }); - - return NextResponse.json({ url: session.url }); - } catch (error: unknown) { - console.error(error); - const message = error instanceof Error ? error.message : 'Unknown error'; - - return NextResponse.json( - { error: `Checkout error: ${message}` }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/enterprise/portal/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/portal/route.ts deleted file mode 100644 index f77a78e5b8..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/portal/route.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { getStripeClient, verifyEnterpriseKey } from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -export async function POST(request: Request) { - if ( - !process.env.STRIPE_SECRET_KEY || - !process.env.ENTERPRISE_JWT_PUBLIC_KEY - ) { - console.error( - '[enterprise-portal] 503 — STRIPE_SECRET_KEY and/or ENTERPRISE_JWT_PUBLIC_KEY are not configured', - ); - return NextResponse.json( - { error: 'Enterprise billing portal is not configured.' }, - { status: 503 }, - ); - } - - try { - const body = (await request.json()) as { - enterpriseKey?: unknown; - returnUrl?: unknown; - }; - const { enterpriseKey, returnUrl } = body; - - if (!enterpriseKey || typeof enterpriseKey !== 'string') { - return NextResponse.json( - { error: 'Missing enterpriseKey' }, - { status: 400 }, - ); - } - - const payload = verifyEnterpriseKey(enterpriseKey); - - if (!payload) { - return NextResponse.json( - { error: 'Invalid enterprise key' }, - { status: 403 }, - ); - } - - const stripe = getStripeClient(); - const subscription = await stripe.subscriptions.retrieve(payload.sub); - - const customerId = - typeof subscription.customer === 'string' - ? subscription.customer - : subscription.customer.id; - - const frontendUrl = process.env.NEXT_PUBLIC_WEBSITE_URL; - - if (!frontendUrl) { - return NextResponse.json( - { error: 'NEXT_PUBLIC_WEBSITE_URL is not configured' }, - { status: 500 }, - ); - } - - const fullReturnUrl = - typeof returnUrl === 'string' - ? `${frontendUrl}${returnUrl}` - : frontendUrl; - - const session = await stripe.billingPortal.sessions.create({ - customer: customerId, - return_url: fullReturnUrl, - }); - - return NextResponse.json({ url: session.url }); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : 'Unknown error'; - - return NextResponse.json( - { error: `Portal error: ${message}` }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/enterprise/reissue/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/reissue/route.ts deleted file mode 100644 index 442baecbee..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/reissue/route.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto'; - -import { NextResponse } from 'next/server'; - -import { - getLicenseeFromStripeCustomer, - getStripeClient, - signEnterpriseKey, -} from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -function isSecretValid(providedSecret: string): boolean { - const expectedSecret = process.env.ENTERPRISE_ADMIN_API_SECRET; - - if (!expectedSecret || !providedSecret) { - return false; - } - - const comparisonKey = randomBytes(32); - const expectedDigest = createHmac('sha256', comparisonKey) - .update(expectedSecret) - .digest(); - const providedDigest = createHmac('sha256', comparisonKey) - .update(providedSecret) - .digest(); - - return timingSafeEqual(expectedDigest, providedDigest); -} - -export async function POST(request: Request) { - if ( - !process.env.STRIPE_SECRET_KEY || - !process.env.ENTERPRISE_JWT_PRIVATE_KEY || - !process.env.ENTERPRISE_ADMIN_API_SECRET - ) { - console.error( - '[enterprise-reissue] 503 — STRIPE_SECRET_KEY, ENTERPRISE_JWT_PRIVATE_KEY and/or ENTERPRISE_ADMIN_API_SECRET are not configured', - ); - return NextResponse.json( - { error: 'Enterprise key reissue is not configured.' }, - { status: 503 }, - ); - } - - try { - let body: { subscriptionId?: unknown; secret?: unknown } = {}; - - try { - body = await request.json(); - } catch { - body = {}; - } - - const secret = typeof body.secret === 'string' ? body.secret : ''; - - if (!isSecretValid(secret)) { - return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); - } - - const subscriptionId = - typeof body.subscriptionId === 'string' ? body.subscriptionId : ''; - - if (!subscriptionId) { - return NextResponse.json( - { error: 'Missing subscriptionId' }, - { status: 400 }, - ); - } - - const stripe = getStripeClient(); - - const subscription = await stripe.subscriptions.retrieve(subscriptionId, { - expand: ['customer'], - }); - - const licensee = getLicenseeFromStripeCustomer(subscription.customer); - const enterpriseKey = signEnterpriseKey(subscription.id, licensee); - - const response = NextResponse.json({ - enterpriseKey, - licensee, - subscriptionId: subscription.id, - subscriptionStatus: subscription.status, - }); - - response.headers.set('Cache-Control', 'no-store'); - - return response; - } catch (error: unknown) { - console.error('Enterprise key reissue failed', error); - - return NextResponse.json( - { error: 'Internal server error' }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/enterprise/seats/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/seats/route.ts deleted file mode 100644 index 12456305fa..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/seats/route.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { getStripeClient, verifyEnterpriseKey } from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -const NON_UPDATABLE_STATUSES = new Set(['canceled', 'incomplete_expired']); - -export async function POST(request: Request) { - if ( - !process.env.STRIPE_SECRET_KEY || - !process.env.ENTERPRISE_JWT_PUBLIC_KEY - ) { - console.error( - '[enterprise-seats] 503 — STRIPE_SECRET_KEY and/or ENTERPRISE_JWT_PUBLIC_KEY are not configured', - ); - return NextResponse.json( - { error: 'Enterprise seat management is not configured.' }, - { status: 503 }, - ); - } - - try { - const body = (await request.json()) as { - enterpriseKey?: unknown; - seatCount?: unknown; - }; - const { enterpriseKey, seatCount } = body; - - if (!enterpriseKey || typeof enterpriseKey !== 'string') { - return NextResponse.json( - { error: 'Missing enterpriseKey' }, - { status: 400 }, - ); - } - - if (typeof seatCount !== 'number' || seatCount < 1) { - return NextResponse.json({ error: 'Invalid seatCount' }, { status: 400 }); - } - - const payload = verifyEnterpriseKey(enterpriseKey); - - if (!payload) { - return NextResponse.json( - { error: 'Invalid enterprise key' }, - { status: 403 }, - ); - } - - const stripe = getStripeClient(); - const subscription = await stripe.subscriptions.retrieve(payload.sub); - - if ( - NON_UPDATABLE_STATUSES.has(subscription.status) || - subscription.cancel_at_period_end - ) { - return NextResponse.json({ - success: false, - reason: 'Subscription is canceled or scheduled for cancellation', - seatCount: subscription.items.data[0]?.quantity ?? 0, - subscriptionId: payload.sub, - }); - } - - if (!subscription.items.data[0]) { - return NextResponse.json( - { error: 'No subscription item found' }, - { status: 400 }, - ); - } - - const subscriptionItemId = subscription.items.data[0].id; - - await stripe.subscriptions.update(payload.sub, { - items: [ - { - id: subscriptionItemId, - quantity: seatCount, - }, - ], - proration_behavior: 'create_prorations', - }); - - return NextResponse.json({ - success: true, - seatCount, - subscriptionId: payload.sub, - }); - } catch (error: unknown) { - console.error(error); - const message = error instanceof Error ? error.message : 'Unknown error'; - - return NextResponse.json( - { error: `Seat update error: ${message}` }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/enterprise/status/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/status/route.ts deleted file mode 100644 index 0e37c782cd..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/status/route.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { - getStripeClient, - getSubscriptionCurrentPeriodEnd, - verifyEnterpriseKey, -} from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -export async function POST(request: Request) { - if ( - !process.env.STRIPE_SECRET_KEY || - !process.env.ENTERPRISE_JWT_PUBLIC_KEY - ) { - console.error( - '[enterprise-status] 503 — STRIPE_SECRET_KEY and/or ENTERPRISE_JWT_PUBLIC_KEY are not configured', - ); - return NextResponse.json( - { error: 'Enterprise status is not configured.' }, - { status: 503 }, - ); - } - - try { - const body = (await request.json()) as { enterpriseKey?: unknown }; - const { enterpriseKey } = body; - - if (!enterpriseKey || typeof enterpriseKey !== 'string') { - return NextResponse.json( - { error: 'Missing enterpriseKey' }, - { status: 400 }, - ); - } - - const payload = verifyEnterpriseKey(enterpriseKey); - - if (!payload) { - return NextResponse.json( - { error: 'Invalid enterprise key' }, - { status: 403 }, - ); - } - - const stripe = getStripeClient(); - const subscription = await stripe.subscriptions.retrieve(payload.sub); - - const rawCancelAt = subscription.cancel_at; - const rawCancelAtPeriodEnd = subscription.cancel_at_period_end; - const rawCurrentPeriodEnd = getSubscriptionCurrentPeriodEnd(subscription); - - const effectiveCancelAt = - rawCancelAt ?? - (rawCancelAtPeriodEnd && rawCurrentPeriodEnd - ? rawCurrentPeriodEnd - : null); - - const isCancellationScheduled = - subscription.status !== 'canceled' && effectiveCancelAt !== null; - - return NextResponse.json({ - subscriptionId: subscription.id, - status: subscription.status, - cancelAt: effectiveCancelAt, - currentPeriodEnd: rawCurrentPeriodEnd, - isCancellationScheduled, - }); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : 'Unknown error'; - - return NextResponse.json( - { error: `Status error: ${message}` }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/enterprise/validate/route.ts b/packages/twenty-website-redone/src/app/api/enterprise/validate/route.ts deleted file mode 100644 index 97ed5fe402..0000000000 --- a/packages/twenty-website-redone/src/app/api/enterprise/validate/route.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { NextResponse } from 'next/server'; - -import { - getStripeClient, - getSubscriptionCurrentPeriodEnd, - signValidityToken, - verifyEnterpriseKey, -} from '@/platform/enterprise'; - -export const dynamic = 'force-dynamic'; - -const ACTIVATABLE_STATUSES = new Set(['active', 'trialing']); - -export async function POST(request: Request) { - if ( - !process.env.STRIPE_SECRET_KEY || - !process.env.ENTERPRISE_JWT_PUBLIC_KEY || - !process.env.ENTERPRISE_JWT_PRIVATE_KEY - ) { - console.error( - '[enterprise-validate] 503 — STRIPE_SECRET_KEY, ENTERPRISE_JWT_PUBLIC_KEY and/or ENTERPRISE_JWT_PRIVATE_KEY are not configured', - ); - return NextResponse.json( - { error: 'Enterprise validation is not configured.' }, - { status: 503 }, - ); - } - - try { - const body = (await request.json()) as { enterpriseKey?: unknown }; - const { enterpriseKey } = body; - - if (!enterpriseKey || typeof enterpriseKey !== 'string') { - return NextResponse.json( - { error: 'Missing enterpriseKey' }, - { status: 400 }, - ); - } - - const payload = verifyEnterpriseKey(enterpriseKey); - - if (!payload) { - return NextResponse.json( - { error: 'Invalid enterprise key' }, - { status: 403 }, - ); - } - - const stripe = getStripeClient(); - const subscription = await stripe.subscriptions.retrieve(payload.sub); - - if (!ACTIVATABLE_STATUSES.has(subscription.status)) { - return NextResponse.json( - { error: 'Subscription is not active', status: subscription.status }, - { status: 403 }, - ); - } - - const rawCancelAt = subscription.cancel_at; - const rawCancelAtPeriodEnd = subscription.cancel_at_period_end; - const rawCurrentPeriodEnd = getSubscriptionCurrentPeriodEnd(subscription); - const effectiveCancelAt = - rawCancelAt ?? - (rawCancelAtPeriodEnd && rawCurrentPeriodEnd - ? rawCurrentPeriodEnd - : null); - - const validityToken = signValidityToken(payload.sub, { - subscriptionCancelAt: effectiveCancelAt, - }); - - return NextResponse.json({ - validityToken, - licensee: payload.licensee, - subscriptionId: payload.sub, - subscriptionStatus: subscription.status, - }); - } catch (error: unknown) { - const message = error instanceof Error ? error.message : 'Unknown error'; - - return NextResponse.json( - { error: `Validation error: ${message}` }, - { status: 500 }, - ); - } -} diff --git a/packages/twenty-website-redone/src/app/api/partner-application/route.ts b/packages/twenty-website-redone/src/app/api/partner-application/route.ts deleted file mode 100644 index b4fea41992..0000000000 --- a/packages/twenty-website-redone/src/app/api/partner-application/route.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { NextResponse } from 'next/server'; -import { z } from 'zod'; - -import { buildLogicFunctionPayload } from '@/partner-application/build-logic-function-payload'; -import { partnerApplicationRequestSchema } from '@/partner-application/partner-application-request-schema'; -import { - createRateLimiter, - fetchWithTimeout, - getClientIpKey, - readJsonBody, -} from '@/platform/http'; - -// z.url (not z.httpUrl) so localhost webhook destinations are accepted in dev; -// z.httpUrl would reject http://localhost:2020/... by demanding a TLD hostname. -const webhookUrlSchema = z - .string() - .trim() - .pipe(z.url({ error: 'Invalid webhook URL.' })); - -const applicationSecretSchema = z.string().trim().min(1); - -const MAX_BODY_BYTES = 16 * 1024; -const WEBHOOK_TIMEOUT_MS = 8_000; - -const checkRateLimit = createRateLimiter({ capacity: 5, refillPerSec: 1 / 60 }); - -export async function POST(request: Request) { - const webhookUrlResult = webhookUrlSchema.safeParse( - process.env.PARTNER_APPLICATION_WEBHOOK_URL, - ); - const secretResult = applicationSecretSchema.safeParse( - process.env.PARTNER_APPLICATION_SECRET, - ); - - if (!webhookUrlResult.success || !secretResult.success) { - const rawWebhookUrl = process.env.PARTNER_APPLICATION_WEBHOOK_URL; - const rawSecret = process.env.PARTNER_APPLICATION_SECRET; - console.error( - '[partner-application] 503 — endpoint env vars failed validation', - JSON.stringify({ - PARTNER_APPLICATION_WEBHOOK_URL: { - present: rawWebhookUrl !== undefined, - isEmptyAfterTrim: (rawWebhookUrl ?? '').trim() === '', - length: (rawWebhookUrl ?? '').length, - parseError: webhookUrlResult.success - ? null - : (webhookUrlResult.error.issues[0]?.message ?? 'unknown'), - }, - PARTNER_APPLICATION_SECRET: { - present: rawSecret !== undefined, - isEmptyAfterTrim: (rawSecret ?? '').trim() === '', - length: (rawSecret ?? '').length, - parseError: secretResult.success - ? null - : (secretResult.error.issues[0]?.message ?? 'unknown'), - }, - envFileHint: - 'Next dev reads .env.local. After editing env vars restart the dev server — Next does not hot-reload them.', - }), - ); - return NextResponse.json( - { error: 'Partner application endpoint is not configured.' }, - { status: 503 }, - ); - } - - const webhookUrl = webhookUrlResult.data; - const applicationSecret = secretResult.data; - - const rateLimit = checkRateLimit(getClientIpKey(request)); - if (!rateLimit.allowed) { - const retryAfterSeconds = Math.max( - 1, - Math.ceil(rateLimit.retryAfterMs / 1000), - ); - return NextResponse.json( - { error: 'Too many requests. Please try again shortly.' }, - { status: 429, headers: { 'Retry-After': String(retryAfterSeconds) } }, - ); - } - - const bodyResult = await readJsonBody(request, { - maxBytes: MAX_BODY_BYTES, - }); - - if (!bodyResult.ok) { - switch (bodyResult.error) { - case 'wrong-content-type': - return NextResponse.json( - { error: 'Content-Type must be application/json.' }, - { status: 415 }, - ); - case 'too-large': - return NextResponse.json( - { error: 'Request body is too large.' }, - { status: 413 }, - ); - case 'invalid-json': - return NextResponse.json( - { error: 'Invalid JSON body.' }, - { status: 400 }, - ); - } - } - - const parsed = partnerApplicationRequestSchema.safeParse(bodyResult.value); - if (!parsed.success) { - const message = parsed.error.issues[0]?.message ?? 'Invalid request body.'; - return NextResponse.json({ error: message }, { status: 400 }); - } - - const payload = buildLogicFunctionPayload(parsed.data); - - const upstream = await fetchWithTimeout( - webhookUrl, - { - body: JSON.stringify(payload), - headers: { - 'Content-Type': 'application/json', - 'X-Application-Secret': applicationSecret, - }, - method: 'POST', - }, - { timeoutMs: WEBHOOK_TIMEOUT_MS }, - ); - - if (!upstream.ok) { - const status = upstream.error === 'timeout' ? 504 : 502; - console.error( - '[partner-application] upstream fetch failed', - JSON.stringify({ - error: upstream.error, - payloadKeys: Object.keys(payload), - }), - ); - return NextResponse.json( - { error: 'Partner application could not be submitted.' }, - { status }, - ); - } - - let upstreamBody: string; - try { - upstreamBody = await upstream.response.text(); - } catch { - upstreamBody = ''; - } - - if (!upstream.response.ok) { - console.error( - '[partner-application] upstream returned non-2xx', - JSON.stringify({ - status: upstream.response.status, - body: upstreamBody.slice(0, 2000), - payloadKeys: Object.keys(payload), - }), - ); - return NextResponse.json( - { error: 'Partner application could not be submitted.' }, - { status: 502 }, - ); - } - - let logicResult: unknown; - try { - logicResult = JSON.parse(upstreamBody); - } catch { - logicResult = null; - } - - if ( - typeof logicResult !== 'object' || - logicResult === null || - (logicResult as Record)['ok'] !== true - ) { - console.error( - '[partner-application] logic function returned non-ok result', - JSON.stringify({ - body: upstreamBody.slice(0, 2000), - payloadKeys: Object.keys(payload), - }), - ); - return NextResponse.json( - { error: 'Partner application could not be submitted.' }, - { status: 502 }, - ); - } - - return NextResponse.json({ success: true }); -} diff --git a/packages/twenty-website-redone/src/app/favicon.ico b/packages/twenty-website-redone/src/app/favicon.ico deleted file mode 100644 index d611985bfd..0000000000 Binary files a/packages/twenty-website-redone/src/app/favicon.ico and /dev/null differ diff --git a/packages/twenty-website-redone/src/app/robots.ts b/packages/twenty-website-redone/src/app/robots.ts deleted file mode 100644 index e936b77f01..0000000000 --- a/packages/twenty-website-redone/src/app/robots.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { type MetadataRoute } from 'next'; - -import { getRobotsDisallowedRoutePaths } from '@/platform/routing'; -import { getSiteUrl } from '@/platform/seo'; - -const ALWAYS_DISALLOW: readonly string[] = ['/api/']; - -export default function robots(): MetadataRoute.Robots { - return { - rules: [ - { - userAgent: '*', - allow: '/', - disallow: [...ALWAYS_DISALLOW, ...getRobotsDisallowedRoutePaths()], - }, - ], - sitemap: `${getSiteUrl()}/sitemap.xml`, - }; -} diff --git a/packages/twenty-website-redone/src/app/sitemap.ts b/packages/twenty-website-redone/src/app/sitemap.ts deleted file mode 100644 index e3ba0ffb87..0000000000 --- a/packages/twenty-website-redone/src/app/sitemap.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { type MetadataRoute } from 'next'; -import { SOURCE_LOCALE, type AppLocale } from 'twenty-shared/translations'; - -import { localeToUrlSegment } from '@/platform/i18n/locale-to-url-segment'; -import { WEBSITE_LOCALE_LIST } from '@/platform/i18n/website-locale-list'; -import { getIndexedWebsiteRoutes } from '@/platform/routing'; -import { WEBSITE_ROUTE_FAMILY_LIST } from '@/platform/routing/website-route-family-list'; -import { getSiteUrl } from '@/platform/seo'; - -const SITE_URL = getSiteUrl(); - -const buildLocalizedUrl = (locale: AppLocale, path: string): string => { - const prefix = - locale === SOURCE_LOCALE ? '' : `/${localeToUrlSegment(locale)}`; - const tail = path === '/' ? '' : path; - return `${SITE_URL}${prefix}${tail}`; -}; - -const buildLanguageAlternates = ( - path: string, - locales: readonly AppLocale[], -): Record => { - const alternates: Record = {}; - for (const locale of locales) { - alternates[locale] = buildLocalizedUrl(locale, path); - } - alternates['x-default'] = buildLocalizedUrl(SOURCE_LOCALE, path); - return alternates; -}; - -const localesFor = ( - localeMode: 'all' | 'source' | undefined, -): readonly AppLocale[] => - localeMode === 'source' ? [SOURCE_LOCALE] : WEBSITE_LOCALE_LIST; - -const entriesFor = ( - path: string, - locales: readonly AppLocale[], - shared: { - changeFrequency: MetadataRoute.Sitemap[number]['changeFrequency']; - priority: number; - lastModified?: Date; - }, -): MetadataRoute.Sitemap => - locales.map((locale) => ({ - url: buildLocalizedUrl(locale, path), - changeFrequency: shared.changeFrequency, - priority: shared.priority, - lastModified: shared.lastModified, - alternates: { languages: buildLanguageAlternates(path, locales) }, - })); - -export default async function sitemap(): Promise { - const staticEntries = getIndexedWebsiteRoutes().flatMap((route) => - entriesFor(route.path, localesFor(route.localeMode), route), - ); - - const familyEntries = await Promise.all( - WEBSITE_ROUTE_FAMILY_LIST.filter((family) => family.indexed).map( - async (family) => { - const entries = await family.enumerateEntries(); - return entries.flatMap((entry) => - entriesFor( - `${family.basePath}/${entry.slug}`, - localesFor(family.localeMode), - { - changeFrequency: family.changeFrequency, - priority: family.priority, - lastModified: entry.lastModified, - }, - ), - ); - }, - ), - ); - - return [...staticEntries, ...familyEntries.flat()]; -} diff --git a/packages/twenty-website-redone/src/icons/index.ts b/packages/twenty-website-redone/src/icons/index.ts deleted file mode 100644 index 6984dfeadf..0000000000 --- a/packages/twenty-website-redone/src/icons/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -export { AppleRainbowMark } from './AppleRainbowMark'; -export { ArrowLeft, type ArrowLeftProps } from './ArrowLeft'; -export { ArrowRight, type ArrowRightProps } from './ArrowRight'; -export { ArrowUpRight, type ArrowUpRightProps } from './ArrowUpRight'; -export { CheckMark, type CheckMarkProps } from './CheckMark'; -export { ChevronDown, type ChevronDownProps } from './ChevronDown'; -export { ClaudeMark } from './ClaudeMark'; -export { DiscordMark, type DiscordMarkProps } from './DiscordMark'; -export { FastPathIcon, type FastPathIconProps } from './FastPath'; -export { MarkerCursor, type MarkerCursorProps } from './MarkerCursor'; -export { PeopleGroupMark } from './PeopleGroupMark'; -export { GitHubMark, type GitHubMarkProps } from './GithubMark'; -export { - INFORMATIVE_MARKS, - type InformativeMarkProps, -} from './InformativeMarks'; -export { LiveDataIcon, type LiveDataIconProps } from './LiveData'; -export { MinusMark, type MinusMarkProps } from './MinusMark'; -export { PlusMark, type PlusMarkProps } from './PlusMark'; -export { RatingStar, type RatingStarProps } from './RatingStar'; -export { Search, type SearchProps } from './Search'; -export { TwentyLogo, type TwentyLogoProps } from './TwentyLogo'; -export { type IconComponent } from './icon-component'; diff --git a/packages/twenty-website-redone/src/locales/en.po b/packages/twenty-website-redone/src/locales/en.po deleted file mode 100644 index 6943814c84..0000000000 --- a/packages/twenty-website-redone/src/locales/en.po +++ /dev/null @@ -1,6432 +0,0 @@ -msgid "" -msgstr "" -"POT-Creation-Date: 2026-06-11 02:05+0500\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: @lingui/cli\n" -"Language: en\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Plural-Forms: \n" - -#. js-lingui-id: BUIzFF -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "-33% off" -msgstr "-33% off" - -#. js-lingui-id: AGZHx4 -#: src/sections/product-hero/product-hero.tsx -msgid "...with AI that actually helps you *work faster*" -msgstr "...with AI that actually helps you *work faster*" - -#. js-lingui-id: Z6mKXu -#. placeholder {0}: partner.name -#: src/app/[locale]/(site)/partners/profile/[slug]/page.tsx -msgid "{0} — Twenty Partner" -msgstr "{0} — Twenty Partner" - -#. js-lingui-id: sGt3Jm -#. placeholder {0}: i18n._(card.attribution.company) -#: src/sections/three-cards/illustration-card.tsx -msgid "{0} case study" -msgstr "{0} case study" - -#. js-lingui-id: jC5JCB -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "{count} Case Studies" -msgstr "{count} Case Studies" - -#. js-lingui-id: NSO/FI -#: src/partners-marketplace/partner-rates-panel.tsx -#: src/partners-marketplace/partner-money-row.tsx -msgid "{hourly}/hr" -msgstr "{hourly}/hr" - -#. js-lingui-id: rAP+km -#: src/partners-marketplace/filter-dropdown.tsx -msgid "{labelText} filter" -msgstr "{labelText} filter" - -#. js-lingui-id: 7hlEpj -#. placeholder {0}: selected.size -#: src/partners-marketplace/filter-dropdown.tsx -msgid "{labelText} filter, {0} selected" -msgstr "{labelText} filter, {0} selected" - -#. js-lingui-id: 0Qb9by -#: src/case-studies/case-study-stories.ts -msgid "*150 hours* saved every month" -msgstr "*150 hours* saved every month" - -#. js-lingui-id: k3IzYC -#: src/case-studies/case-study-stories.ts -msgid "*Zero manual work* at the core" -msgstr "*Zero manual work* at the core" - -#. js-lingui-id: icND7o -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "/ seat / month - billed yearly" -msgstr "/ seat / month - billed yearly" - -#. js-lingui-id: XUqxHW -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "/user/month" -msgstr "/user/month" - -#. js-lingui-id: UEDohT -#: src/sections/footer/footer-bottom.tsx -msgid "© {year} – Twenty" -msgstr "© {year} – Twenty" - -#. js-lingui-id: 2ygf/L -#: src/partner-application/partner-application-copy.ts -msgid "← Back" -msgstr "← Back" - -#. js-lingui-id: 9j/bUt -#: src/partners-marketplace/back-to-marketplace-link.tsx -msgid "← Twenty partners" -msgstr "← Twenty partners" - -#. js-lingui-id: foGG8A -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$105/user per month" -msgstr "+$105/user per month" - -#. js-lingui-id: Bsq9GJ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$35/user per month" -msgstr "+$35/user per month" - -#. js-lingui-id: mWSpW5 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$5/user per month" -msgstr "+$5/user per month" - -#. js-lingui-id: JIwDAd -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$7000/org per month" -msgstr "+$7000/org per month" - -#. js-lingui-id: yVr18d -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" -"+$75/user per month\n" -"Switch to enterprise!" - -#. js-lingui-id: iK+ikF -#: src/sections/trusted-by/trusted-by.tsx -msgid "+10k others" -msgstr "+10k others" - -#. js-lingui-id: nRtVCK -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"+20% of net spend\n" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" -"+20% of net spend\n" -"+$75/user per month\n" -"Switch to enterprise!" - -#. js-lingui-id: BmAWVq -#: src/platform/releases/release-notes.tsx -msgid "<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management." -msgstr "<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management." - -#. js-lingui-id: pQcyVv -#: src/platform/releases/release-notes.tsx -msgid "<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\"No Value\" Column: Cards that are not assigned to a specific value will now appear in a \"No Value\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked." -msgstr "<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\"No Value\" Column: Cards that are not assigned to a specific value will now appear in a \"No Value\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked." - -#. js-lingui-id: cCqojY -#: src/platform/releases/release-notes.tsx -msgid "<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access." -msgstr "<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access." - -#. js-lingui-id: be30i9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$0" -msgstr "$0" - -#. js-lingui-id: 6inRXo -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"$1/orchestration run/org\n" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" -"$1/orchestration run/org\n" -"+$75/user per month\n" -"Switch to enterprise!" - -#. js-lingui-id: EkIZkY -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$19" -msgstr "$19" - -#. js-lingui-id: 8r6DgO -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$9" -msgstr "$9" - -#. js-lingui-id: EHNAf2 -#: src/case-studies/case-study-catalog.ts -msgid "1 click" -msgstr "1 click" - -#. js-lingui-id: qvNspm -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "1‑800‑YES‑SOFTWARE" -msgstr "1‑800‑YES‑SOFTWARE" - -#. js-lingui-id: 6WQdu8 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "100 per minute" -msgstr "100 per minute" - -#. js-lingui-id: uuKUqZ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"11 permissions\n" -"groups" -msgstr "" -"11 permissions\n" -"groups" - -#. js-lingui-id: 2szX5S -#: src/partner-application/partner-application-copy.ts -msgid "150" -msgstr "150" - -#. js-lingui-id: 9ntyY8 -#: src/case-studies/case-study-catalog.ts -msgid "150 hrs" -msgstr "150 hrs" - -#. js-lingui-id: 2z1Znr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "2 years contract" -msgstr "2 years contract" - -#. js-lingui-id: l6Vx4q -#: src/case-studies/case-study-catalog.ts -msgid "2,000+" -msgstr "2,000+" - -#. js-lingui-id: FKcV/y -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "2025" -msgstr "2025" - -#. js-lingui-id: PJgfBS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "3" -msgstr "3" - -#. js-lingui-id: BL47wE -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"3 2 years contract\n" -"-33% off" -msgstr "" -"3 2 years contract\n" -"-33% off" - -#. js-lingui-id: /jgC+9 -#: src/case-studies/case-study-catalog.ts -msgid "3 product lines" -msgstr "3 product lines" - -#. js-lingui-id: 7SJhyh -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "30+" -msgstr "30+" - -#. js-lingui-id: Pdl2UE -#: src/case-studies/case-study-catalog.ts -msgid "4 tools" -msgstr "4 tools" - -#. js-lingui-id: 2ScEtE -#: src/sections/pricing-plans/plans-data.ts -msgid "5 workflow credits/month included" -msgstr "5 workflow credits/month included" - -#. js-lingui-id: hIKxCy -#: src/partner-application/partner-application-copy.ts -msgid "5,000" -msgstr "5,000" - -#. js-lingui-id: Z2TH0F -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "50 per minute" -msgstr "50 per minute" - -#. js-lingui-id: CiRGZ8 -#: src/sections/pricing-plans/plans-data.ts -msgid "50 workflow credits/year included" -msgstr "50 workflow credits/year included" - -#. js-lingui-id: tZvajW -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "6 workflows" -msgstr "6 workflows" - -#. js-lingui-id: fHxYPM -#: src/case-studies/case-study-catalog.ts -msgid "90%+" -msgstr "90%+" - -#. js-lingui-id: u6Xxdi -#: src/case-studies/case-study-stories.ts -msgid "A business that does not fit a *template*" -msgstr "A business that does not fit a *template*" - -#. js-lingui-id: NLSM5L -#: src/case-studies/case-study-stories.ts -msgid "A business that does not fit a template" -msgstr "A business that does not fit a template" - -#. js-lingui-id: SR9TmK -#: src/sections/product-hero/product-hero.tsx -msgid "A CRM for teams that *move fast*" -msgstr "A CRM for teams that *move fast*" - -#. js-lingui-id: MXRINg -#: src/case-studies/case-study-stories.ts -msgid "" -"A CRM that\n" -"*grows* with you" -msgstr "" -"A CRM that\n" -"*grows* with you" - -#. js-lingui-id: diWAWP -#: src/case-studies/case-study-catalog.ts -msgid "A CRM that grows with you" -msgstr "A CRM that grows with you" - -#. js-lingui-id: och6cp -#: src/case-studies/case-study-stories.ts -msgid "A CRM that grows with you | NetZero & Twenty" -msgstr "A CRM that grows with you | NetZero & Twenty" - -#. js-lingui-id: N3qsQD -#: src/case-studies/case-study-stories.ts -msgid "" -"A CRM they\n" -"*actually own*" -msgstr "" -"A CRM they\n" -"*actually own*" - -#. js-lingui-id: muZzEA -#: src/case-studies/case-study-catalog.ts -msgid "A CRM they actually own" -msgstr "A CRM they actually own" - -#. js-lingui-id: HSyZ9R -#: src/sections/problem/problem.tsx -msgid "A custom CRM gives your org an edge, *but building one* comes with *tradeoffs*" -msgstr "A custom CRM gives your org an edge, *but building one* comes with *tradeoffs*" - -#. js-lingui-id: Ll7vsZ -#: src/sections/product-demo/product-demo.tsx -msgid "A demo worth a *thousand words*" -msgstr "A demo worth a *thousand words*" - -#. js-lingui-id: uNIo/j -#: src/sections/three-cards/product-three-cards.tsx -msgid "A modern CRM with *an intuitive interface*" -msgstr "A modern CRM with *an intuitive interface*" - -#. js-lingui-id: sDJ4rX -#: src/platform/releases/release-notes.tsx -msgid "A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views." -msgstr "A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views." - -#. js-lingui-id: aYUQpm -#: src/platform/releases/release-notes.tsx -msgid "A new maintenance mode helps admins pause workspace changes during sensitive operations." -msgstr "A new maintenance mode helps admins pause workspace changes during sensitive operations." - -#. js-lingui-id: P5BDuh -#: src/case-studies/case-study-stories.ts -msgid "A platform ready to *grow*" -msgstr "A platform ready to *grow*" - -#. js-lingui-id: rxMguZ -#: src/case-studies/case-study-stories.ts -msgid "A platform ready to grow" -msgstr "A platform ready to grow" - -#. js-lingui-id: vbJW8I -#: src/case-studies/case-study-stories.ts -msgid "" -"A real estate agency on WhatsApp built a\n" -"*CRM* around it" -msgstr "" -"A real estate agency on WhatsApp built a\n" -"*CRM* around it" - -#. js-lingui-id: hwoGni -#: src/case-studies/case-study-catalog.ts -msgid "A real estate agency on WhatsApp built a CRM around it" -msgstr "A real estate agency on WhatsApp built a CRM around it" - -#. js-lingui-id: WjUlJr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "A retro theme as a paid add-on is somehow the most believable part." -msgstr "A retro theme as a paid add-on is somehow the most believable part." - -#. js-lingui-id: r9Msiv -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \"I want this\" and \"it's live\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption." -msgstr "A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \"I want this\" and \"it's live\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption." - -#. js-lingui-id: H1lDvm -#: src/platform/releases/release-notes.tsx -msgid "Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update." -msgstr "Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update." - -#. js-lingui-id: c0RR2h -#: src/case-studies/case-study-stories.ts -msgid "About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together." -msgstr "About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together." - -#. js-lingui-id: 41o3VS -#: src/case-studies/case-study-catalog.ts -msgid "AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control." -msgstr "AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control." - -#. js-lingui-id: TuJiQF -#: src/sections/three-cards/three-cards.data.ts -#: src/case-studies/case-study-stories.ts -msgid "AC&T Education Migration" -msgstr "AC&T Education Migration" - -#. js-lingui-id: yHUdh6 -#: src/case-studies/case-study-stories.ts -msgid "AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export." -msgstr "AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export." - -#. js-lingui-id: MPzy5R -#: src/sections/three-cards/three-cards.data.ts -msgid "AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%." -msgstr "AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%." - -#. js-lingui-id: J+A83M -#: src/sections/helped/helped.data.ts -msgid "AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%." -msgstr "AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%." - -#. js-lingui-id: Kqfsda -#: src/platform/routing/static-website-routes.ts -msgid "Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance." -msgstr "Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance." - -#. js-lingui-id: muhZ+X -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activating your enterprise license…" -msgstr "Activating your enterprise license…" - -#. js-lingui-id: +cggij -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activation failed. Please try again." -msgstr "Activation failed. Please try again." - -#. js-lingui-id: trCWSt -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activation response was incomplete." -msgstr "Activation response was incomplete." - -#. js-lingui-id: Yyn/dP -#: src/partners-marketplace/active-filter-pills.tsx -msgid "Active filters" -msgstr "Active filters" - -#. js-lingui-id: iNSn2+ -#: src/platform/releases/release-notes.tsx -msgid "Add files directly to records so documents, screenshots, and other assets stay attached to the right work." -msgstr "Add files directly to records so documents, screenshots, and other assets stay attached to the right work." - -#. js-lingui-id: x0pZJy -#: src/platform/releases/release-notes.tsx -msgid "Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define." -msgstr "Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define." - -#. js-lingui-id: woOp+c -#: src/sections/stepper/product-stepper-data.ts -msgid "Add objects and fields" -msgstr "Add objects and fields" - -#. js-lingui-id: ZuoQMi -#: src/platform/releases/release-notes.tsx -msgid "Add records to filtered views" -msgstr "Add records to filtered views" - -#. js-lingui-id: l3+wiC -#: src/platform/releases/release-notes.tsx -msgid "Add rich text directly inside layouts with the new dedicated field widget." -msgstr "Add rich text directly inside layouts with the new dedicated field widget." - -#. js-lingui-id: ced+/c -#: src/platform/releases/release-notes.tsx -msgid "Add Several emails for one contact" -msgstr "Add Several emails for one contact" - -#. js-lingui-id: Y2K3rp -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Add-ons" -msgstr "Add-ons" - -#. js-lingui-id: U4glZw -#: src/platform/releases/release-notes.tsx -msgid "Added \"Group By\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu." -msgstr "Added \"Group By\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu." - -#. js-lingui-id: 6u4D5m -#: src/platform/releases/release-notes.tsx -msgid "Address Field Type" -msgstr "Address Field Type" - -#. js-lingui-id: g1in8j -#: src/platform/releases/release-notes.tsx -msgid "Admin Panel" -msgstr "Admin Panel" - -#. js-lingui-id: Op7nVF -#: src/case-studies/case-study-stories.ts -msgid "Adoption" -msgstr "Adoption" - -#. js-lingui-id: SUk0w7 -#: src/platform/releases/release-notes.tsx -msgid "Advanced Email and Calendar Settings" -msgstr "Advanced Email and Calendar Settings" - -#. js-lingui-id: dePx/O -#: src/platform/releases/release-notes.tsx -msgid "Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction." -msgstr "Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction." - -#. js-lingui-id: c0acMS -#: src/platform/releases/release-notes.tsx -msgid "Advanced filters" -msgstr "Advanced filters" - -#. js-lingui-id: JiIKww -#: src/platform/releases/release-notes.tsx -msgid "Advanced Settings" -msgstr "Advanced Settings" - -#. js-lingui-id: 2050Pj -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Advisory & Discovery" -msgstr "Advisory & Discovery" - -#. js-lingui-id: QjSFuI -#: src/partner-application/data/partner-country-options.ts -msgid "Afghanistan 🇦🇫" -msgstr "Afghanistan 🇦🇫" - -#. js-lingui-id: StqEz0 -#: src/partners-marketplace/served-geo-labels.ts -msgid "Africa" -msgstr "Africa" - -#. js-lingui-id: NmHsVh -#: src/partner-application/data/partner-team-type-options.ts -msgid "Agency" -msgstr "Agency" - -#. js-lingui-id: vZKKhf -#: src/sections/product-feature/feature-tiles.ts -msgid "Aggregate, bar, line, and pie widgets" -msgstr "Aggregate, bar, line, and pie widgets" - -#. js-lingui-id: HURF9k -#: src/platform/releases/release-notes.tsx -msgid "Aggregates" -msgstr "Aggregates" - -#. js-lingui-id: rp2omj -#: src/case-studies/case-study-catalog.ts -msgid "Agribusiness" -msgstr "Agribusiness" - -#. js-lingui-id: jiGK6+ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "AI (Einstein)" -msgstr "AI (Einstein)" - -#. js-lingui-id: aUn7Ps -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "AI & Automations" -msgstr "AI & Automations" - -#. js-lingui-id: HbXHSp -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "AI agents" -msgstr "AI agents" - -#. js-lingui-id: WGXwzu -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain." -msgstr "AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain." - -#. js-lingui-id: Rsxdfy -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "AI Agents with custom skills" -msgstr "AI Agents with custom skills" - -#. js-lingui-id: JHi+LN -#: src/platform/releases/release-notes.tsx -msgid "AI agents, chats, and MCP" -msgstr "AI agents, chats, and MCP" - -#. js-lingui-id: n2fhCy -#: src/platform/releases/release-notes.tsx -msgid "AI chat" -msgstr "AI chat" - -#. js-lingui-id: YeA2Ox -#: src/platform/releases/release-notes.tsx -msgid "AI Chat is easier to use with a cleaner experience and clearer model choices." -msgstr "AI Chat is easier to use with a cleaner experience and clearer model choices." - -#. js-lingui-id: TfV/y9 -#: src/sections/three-cards/product-three-cards-data.ts -msgid "AI chat, settings, and records in a side panels for fast, single-screen access." -msgstr "AI chat, settings, and records in a side panels for fast, single-screen access." - -#. js-lingui-id: R+bwFB -#: src/sections/three-cards/three-cards.data.ts -msgid "AI for rapid iterations" -msgstr "AI for rapid iterations" - -#. js-lingui-id: svfUwH -#: src/case-studies/case-study-stories.ts -msgid "AI in the *migration workflow*" -msgstr "AI in the *migration workflow*" - -#. js-lingui-id: A6v5aI -#: src/case-studies/case-study-stories.ts -msgid "AI in the migration workflow" -msgstr "AI in the migration workflow" - -#. js-lingui-id: t97j+F -#: src/case-studies/case-study-catalog.ts -msgid "AI-assisted" -msgstr "AI-assisted" - -#. js-lingui-id: 7xlBwk -#: src/partner-application/data/partner-country-options.ts -msgid "Albania 🇦🇱" -msgstr "Albania 🇦🇱" - -#. js-lingui-id: EszGq4 -#: src/partner-application/data/partner-country-options.ts -msgid "Algeria 🇩🇿" -msgstr "Algeria 🇩🇿" - -#. js-lingui-id: LIGwFL -#: src/sections/three-cards/three-cards.data.ts -#: src/case-studies/case-study-stories.ts -msgid "Alternative Partners" -msgstr "Alternative Partners" - -#. js-lingui-id: GDVvyT -#: src/case-studies/case-study-stories.ts -msgid "Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers." -msgstr "Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers." - -#. js-lingui-id: CCrRuT -#: src/case-studies/case-study-catalog.ts -msgid "Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work." -msgstr "Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work." - -#. js-lingui-id: UIu18Y -#: src/sections/three-cards/three-cards.data.ts -msgid "Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee." -msgstr "Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee." - -#. js-lingui-id: +BHPrF -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "always" -msgstr "always" - -#. js-lingui-id: iFLhqi -#: src/sections/testimonials/testimonials.data.ts -msgid "Amrendra Pratap Singh" -msgstr "Amrendra Pratap Singh" - -#. js-lingui-id: Sbiivs -#: src/partner-application/data/partner-country-options.ts -msgid "Andorra 🇦🇩" -msgstr "Andorra 🇦🇩" - -#. js-lingui-id: Uv5eaJ -#: src/partner-application/data/partner-country-options.ts -msgid "Angola 🇦🇴" -msgstr "Angola 🇦🇴" - -#. js-lingui-id: qKANz3 -#: src/partner-application/data/partner-country-options.ts -msgid "Antigua & Barbuda 🇦🇬" -msgstr "Antigua & Barbuda 🇦🇬" - -#. js-lingui-id: BfeCSx -#: src/platform/releases/release-notes.tsx -msgid "Any Field filter" -msgstr "Any Field filter" - -#. js-lingui-id: aGCcXe -#: src/sections/faq/faq.tsx -msgid "Any Questions?" -msgstr "Any Questions?" - -#. js-lingui-id: lgSvgF -#: src/partner-application/partner-application-copy.ts -msgid "Anything else we should know?" -msgstr "Anything else we should know?" - -#. js-lingui-id: pkMjbA -#: src/partner-application/data/partner-scope-options.ts -msgid "Anything that needs a developer." -msgstr "Anything that needs a developer." - -#. js-lingui-id: dYZUP3 -#: src/partner-application/data/partner-scope-options.ts -msgid "Anything that needs devops skills." -msgstr "Anything that needs devops skills." - -#. js-lingui-id: AfiWqP -#: src/partners-marketplace/served-geo-labels.ts -msgid "APAC" -msgstr "APAC" - -#. js-lingui-id: /AMVjF -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "APEX tutorials" -msgstr "APEX tutorials" - -#. js-lingui-id: yKBF3l -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "API access" -msgstr "API access" - -#. js-lingui-id: 30KnZB -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "API calls" -msgstr "API calls" - -#. js-lingui-id: 42FQ3y -#: src/case-studies/case-study-catalog.ts -msgid "API-first" -msgstr "API-first" - -#. js-lingui-id: azQMHP -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "APIs are extra. Simplicity has a price." -msgstr "APIs are extra. Simplicity has a price." - -#. js-lingui-id: MqJvvH -#: src/sections/menu/menu.data.ts -msgid "APIs, SDKs and webhooks to extend Twenty and ship apps on top of your CRM data." -msgstr "APIs, SDKs and webhooks to extend Twenty and ship apps on top of your CRM data." - -#. js-lingui-id: k8I7/G -#: src/partner-application/partner-application-copy.ts -msgid "" -"Apply to build\n" -"*the future of CRM*" -msgstr "" -"Apply to build\n" -"*the future of CRM*" - -#. js-lingui-id: LJCDxT -#: src/platform/routing/static-website-routes.ts -msgid "Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM." -msgstr "Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM." - -#. js-lingui-id: 8HV3WN -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Arabic" -msgstr "Arabic" - -#. js-lingui-id: uicv6Z -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "Architecture" -msgstr "Architecture" - -#. js-lingui-id: fT9xVz -#: src/partner-application/data/partner-country-options.ts -msgid "Argentina 🇦🇷" -msgstr "Argentina 🇦🇷" - -#. js-lingui-id: 3KxGep -#: src/partner-application/data/partner-country-options.ts -msgid "Armenia 🇦🇲" -msgstr "Armenia 🇦🇲" - -#. js-lingui-id: S+Q+1d -#: src/sections/product-hero/product-hero.tsx -msgid "Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams." -msgstr "Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams." - -#. js-lingui-id: 7UGCGX -#: src/sections/three-cards/three-cards.tsx -msgid "Assemble, iterate and adapt a robust CRM, *that's quick to flex*" -msgstr "Assemble, iterate and adapt a robust CRM, *that's quick to flex*" - -#. js-lingui-id: v7zTZl -#: src/sections/product-feature/feature-tiles.ts -msgid "Assign owners and due dates" -msgstr "Assign owners and due dates" - -#. js-lingui-id: awzjg/ -#: src/platform/releases/release-notes.tsx -msgid "Attachment Visualizer" -msgstr "Attachment Visualizer" - -#. js-lingui-id: fxL/Km -#: src/sections/product-feature/feature-tiles.ts -msgid "Attachments without the chaos." -msgstr "Attachments without the chaos." - -#. js-lingui-id: y2W2Hg -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Audit logs" -msgstr "Audit logs" - -#. js-lingui-id: tw0/s1 -#: src/partner-application/data/partner-country-options.ts -msgid "Australia 🇦🇺" -msgstr "Australia 🇦🇺" - -#. js-lingui-id: 4cf5s+ -#: src/partner-application/data/partner-country-options.ts -msgid "Austria 🇦🇹" -msgstr "Austria 🇦🇹" - -#. js-lingui-id: FFv0Vh -#: src/sections/stepper/product-stepper-data.ts -msgid "Automation" -msgstr "Automation" - -#. js-lingui-id: SJ7WSP -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Available on YouTube!" -msgstr "Available on YouTube!" - -#. js-lingui-id: 8d+jRc -#: src/partner-application/data/partner-country-options.ts -msgid "Azerbaijan 🇦🇿" -msgstr "Azerbaijan 🇦🇿" - -#. js-lingui-id: iH8pgl -#: src/sections/case-study-detail/case-study-hero.tsx -msgid "Back" -msgstr "Back" - -#. js-lingui-id: wIoAQo -#: src/partner-application/data/partner-country-options.ts -msgid "Bahamas 🇧🇸" -msgstr "Bahamas 🇧🇸" - -#. js-lingui-id: Rhju1T -#: src/partner-application/data/partner-country-options.ts -msgid "Bahrain 🇧🇭" -msgstr "Bahrain 🇧🇭" - -#. js-lingui-id: LxzgmZ -#: src/partner-application/data/partner-country-options.ts -msgid "Bangladesh 🇧🇩" -msgstr "Bangladesh 🇧🇩" - -#. js-lingui-id: rtcPS0 -#: src/partner-application/data/partner-country-options.ts -msgid "Barbados 🇧🇧" -msgstr "Barbados 🇧🇧" - -#. js-lingui-id: RownlY -#: src/partners-marketplace/partner-facts-list.tsx -msgid "Based in" -msgstr "Based in" - -#. js-lingui-id: jQLfIW -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Because apparently privacy feels more premium with a surcharge." -msgstr "Because apparently privacy feels more premium with a surcharge." - -#. js-lingui-id: qEQv1F -#: src/case-studies/case-study-stories.ts -msgid "Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform." -msgstr "Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform." - -#. js-lingui-id: uIG0OH -#: src/case-studies/case-study-stories.ts -msgid "Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites." -msgstr "Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites." - -#. js-lingui-id: JGM+JO -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Because true orchestration means putting a dollar sign on every dramatic entrance." -msgstr "Because true orchestration means putting a dollar sign on every dramatic entrance." - -#. js-lingui-id: Z7U/Og -#: src/case-studies/case-study-stories.ts -msgid "Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected." -msgstr "Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected." - -#. js-lingui-id: kWm0dC -#: src/sections/partner-hero/partner-hero.tsx -msgid "" -"Become\n" -"*our partner*" -msgstr "" -"Become\n" -"*our partner*" - -#. js-lingui-id: PKMHNe -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "become a genius!" -msgstr "become a genius!" - -#. js-lingui-id: 6ZCRfT -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/partner-hero/partner-hero.tsx -msgid "Become a partner" -msgstr "Become a partner" - -#. js-lingui-id: j+1dcz -#: src/platform/routing/static-website-routes.ts -msgid "Become a Twenty Partner — Apply" -msgstr "Become a Twenty Partner — Apply" - -#. js-lingui-id: 83Wi6G -#: src/sections/stepper/stepper.data.ts -msgid "Begin with production-grade *building blocks*" -msgstr "Begin with production-grade *building blocks*" - -#. js-lingui-id: 0TCnEf -#: src/partner-application/data/partner-country-options.ts -msgid "Belarus 🇧🇾" -msgstr "Belarus 🇧🇾" - -#. js-lingui-id: qblg4t -#: src/partner-application/data/partner-country-options.ts -msgid "Belgium 🇧🇪" -msgstr "Belgium 🇧🇪" - -#. js-lingui-id: pSF7xM -#: src/partner-application/data/partner-country-options.ts -msgid "Belize 🇧🇿" -msgstr "Belize 🇧🇿" - -#. js-lingui-id: Hds3Bq -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Bengali" -msgstr "Bengali" - -#. js-lingui-id: cTWkw3 -#: src/partner-application/data/partner-country-options.ts -msgid "Benin 🇧🇯" -msgstr "Benin 🇧🇯" - -#. js-lingui-id: SYfuGP -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Benjamin Reynolds" -msgstr "Benjamin Reynolds" - -#. js-lingui-id: YfjrMq -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Bertrams" -msgstr "Bertrams" - -#. js-lingui-id: mzTjnf -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Better than Liquid Glass!" -msgstr "Better than Liquid Glass!" - -#. js-lingui-id: T1oJwH -#: src/case-studies/case-study-stories.ts -msgid "Beyond *internal rollout*" -msgstr "Beyond *internal rollout*" - -#. js-lingui-id: OPnz/X -#: src/partner-application/data/partner-country-options.ts -msgid "Bhutan 🇧🇹" -msgstr "Bhutan 🇧🇹" - -#. js-lingui-id: 8tzR0k -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Billing period" -msgstr "Billing period" - -#. js-lingui-id: BpyJwa -#: src/sections/menu/menu.data.ts -msgid "Blue developer illustration with branching arrows" -msgstr "Blue developer illustration with branching arrows" - -#. js-lingui-id: TVJDFA -#: src/partner-application/data/partner-country-options.ts -msgid "Bolivia 🇧🇴" -msgstr "Bolivia 🇧🇴" - -#. js-lingui-id: MkvsWx -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Book a call" -msgstr "Book a call" - -#. js-lingui-id: Wzdd8u -#: src/partner-application/data/partner-country-options.ts -msgid "Bosnia & Herzegovina 🇧🇦" -msgstr "Bosnia & Herzegovina 🇧🇦" - -#. js-lingui-id: wtNsrt -#: src/partner-application/data/partner-country-options.ts -msgid "Botswana 🇧🇼" -msgstr "Botswana 🇧🇼" - -#. js-lingui-id: yCaNfF -#: src/partner-application/data/partner-country-options.ts -msgid "Brazil 🇧🇷" -msgstr "Brazil 🇧🇷" - -#. js-lingui-id: bmk2dj -#: src/platform/routing/static-website-routes.ts -msgid "Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models." -msgstr "Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models." - -#. js-lingui-id: VX4eI/ -#: src/partner-application/data/partner-country-options.ts -msgid "Brunei 🇧🇳" -msgstr "Brunei 🇧🇳" - -#. js-lingui-id: s4FVHa -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -msgid "" -"Build a CRM your\n" -"competitors *can't buy.*" -msgstr "" -"Build a CRM your\n" -"competitors *can't buy.*" - -#. js-lingui-id: sbr0X/ -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Build a dashboard of pipeline by stage" -msgstr "Build a dashboard of pipeline by stage" - -#. js-lingui-id: uetyzD -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Build a pipeline board grouped by stage" -msgstr "Build a pipeline board grouped by stage" - -#. js-lingui-id: 3+uH0v -#: src/platform/releases/release-notes.tsx -msgid "Build an app" -msgstr "Build an app" - -#. js-lingui-id: Utc5RF -#: src/sections/product-feature/feature-tiles.ts -msgid "Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads." -msgstr "Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads." - -#. js-lingui-id: rdvFK9 -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Build it in an afternoon. *AI made the gap that small.*" -msgstr "Build it in an afternoon. *AI made the gap that small.*" - -#. js-lingui-id: e1u+Zh -#: src/sections/menu/menu.data.ts -msgid "Build on an open platform" -msgstr "Build on an open platform" - -#. js-lingui-id: yEKs3h -#: src/platform/releases/release-notes.tsx -msgid "Build with your favorite tools" -msgstr "Build with your favorite tools" - -#. js-lingui-id: 2FDUkV -#: src/sections/home-hero/home-hero.tsx -msgid "Build your Enterprise CRM *at AI Speed*" -msgstr "Build your Enterprise CRM *at AI Speed*" - -#. js-lingui-id: SoAKmY -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Built for speed" -msgstr "Built for speed" - -#. js-lingui-id: sdItv6 -#: src/partner-application/data/partner-country-options.ts -msgid "Bulgaria 🇧🇬" -msgstr "Bulgaria 🇧🇬" - -#. js-lingui-id: Lze0QH -#: src/platform/releases/release-notes.tsx -msgid "Bulk Deletion" -msgstr "Bulk Deletion" - -#. js-lingui-id: dNnRlc -#: src/partner-application/data/partner-country-options.ts -msgid "Burkina Faso 🇧🇫" -msgstr "Burkina Faso 🇧🇫" - -#. js-lingui-id: j8RGrG -#: src/case-studies/case-study-stories.ts -msgid "Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty" -msgstr "Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty" - -#. js-lingui-id: jtdtLa -#: src/partner-application/data/partner-country-options.ts -msgid "Burundi 🇧🇮" -msgstr "Burundi 🇧🇮" - -#. js-lingui-id: L40Ae7 -#: src/partner-application/partner-application-copy.ts -msgid "Calendar / booking link" -msgstr "Calendar / booking link" - -#. js-lingui-id: 6DqzR/ -#: src/platform/releases/release-notes.tsx -msgid "Calendar View for Objects" -msgstr "Calendar View for Objects" - -#. js-lingui-id: 4yFkf9 -#: src/partner-application/data/partner-country-options.ts -msgid "Cambodia 🇰🇭" -msgstr "Cambodia 🇰🇭" - -#. js-lingui-id: AvRzYu -#: src/partner-application/data/partner-country-options.ts -msgid "Cameroon 🇨🇲" -msgstr "Cameroon 🇨🇲" - -#. js-lingui-id: wCALve -#: src/sections/faq/faq.data.ts -msgid "Can developers extend Twenty with code?" -msgstr "Can developers extend Twenty with code?" - -#. js-lingui-id: 6mytgb -#: src/sections/faq/faq.data.ts -msgid "Can I migrate from Salesforce or HubSpot?" -msgstr "Can I migrate from Salesforce or HubSpot?" - -#. js-lingui-id: nEOTNi -#: src/partner-application/data/partner-country-options.ts -msgid "Canada 🇨🇦" -msgstr "Canada 🇨🇦" - -#. js-lingui-id: hRO6uK -#: src/partner-application/data/partner-country-options.ts -msgid "Cape Verde 🇨🇻" -msgstr "Cape Verde 🇨🇻" - -#. js-lingui-id: qLBo3s -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "carousel" -msgstr "carousel" - -#. js-lingui-id: C6wh0T -#: src/sections/case-study-catalog/case-study-card.tsx -msgid "Case" -msgstr "Case" - -#. js-lingui-id: M1RLfx -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Catalan" -msgstr "Catalan" - -#. js-lingui-id: NUrY9o -#: src/partners-marketplace/partner-facts-list.tsx -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Categories" -msgstr "Categories" - -#. js-lingui-id: dBApoS -#: src/partner-application/data/partner-country-options.ts -msgid "Central African Republic 🇨🇫" -msgstr "Central African Republic 🇨🇫" - -#. js-lingui-id: iI3Dq9 -#: src/partner-application/data/partner-country-options.ts -msgid "Chad 🇹🇩" -msgstr "Chad 🇹🇩" - -#. js-lingui-id: +DEogc -#: src/sections/footer/locale-switcher.tsx -msgid "Change language" -msgstr "Change language" - -#. js-lingui-id: 2D9CbR -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Check more add-ons" -msgstr "Check more add-ons" - -#. js-lingui-id: 2BY3So -#: src/partner-application/data/partner-country-options.ts -msgid "Chile 🇨🇱" -msgstr "Chile 🇨🇱" - -#. js-lingui-id: zG6t8U -#: src/partner-application/data/partner-country-options.ts -msgid "China 🇨🇳" -msgstr "China 🇨🇳" - -#. js-lingui-id: h1IXFK -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Chinese" -msgstr "Chinese" - -#. js-lingui-id: s2oWpP -#: src/sections/footer/locale-switcher.tsx -msgid "Choose a language" -msgstr "Choose a language" - -#. js-lingui-id: AZNxzv -#: src/platform/releases/release-notes.tsx -msgid "Choose a role directly when inviting a teammate to a workspace." -msgstr "Choose a role directly when inviting a teammate to a workspace." - -#. js-lingui-id: geiXTM -#: src/platform/releases/release-notes.tsx -msgid "Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need." -msgstr "Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need." - -#. js-lingui-id: TNVfAe -#: src/platform/releases/release-notes.tsx -msgid "Choose how to display dates in any field using a universal Unicode date format that best suits your use case." -msgstr "Choose how to display dates in any field using a universal Unicode date format that best suits your use case." - -#. js-lingui-id: 3wV73y -#: src/partner-application/partner-application-copy.ts -msgid "City" -msgstr "City" - -#. js-lingui-id: ZbCD7v -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Classic never dies. It just gets extended one more time." -msgstr "Classic never dies. It just gets extended one more time." - -#. js-lingui-id: u8JHrO -#: src/partners-marketplace/filter-bar.tsx -#: src/partners-marketplace/empty-state.tsx -msgid "Clear filters" -msgstr "Clear filters" - -#. js-lingui-id: yz7wBu -#: src/app-preview/stage/traffic-lights.tsx -msgid "Close" -msgstr "Close" - -#. js-lingui-id: cu6iol -#: src/sections/pricing-salesfarce/salesfarce-wrong-choice-popup.tsx -msgid "Close dialog" -msgstr "Close dialog" - -#. js-lingui-id: vcpc5o -#: src/sections/menu/menu.tsx -msgid "Close menu" -msgstr "Close menu" - -#. js-lingui-id: oLsrmd -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -msgid "Close pricing window" -msgstr "Close pricing window" - -#. js-lingui-id: R7zx6E -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "cloud" -msgstr "cloud" - -#. js-lingui-id: L/LPQZ -#: src/sections/faq/faq.data.ts -msgid "Cloud Pro is $9/user/month (yearly). Organization is $19/user/month and unlocks SSO and row-level permissions for teams that need finer access control." -msgstr "Cloud Pro is $9/user/month (yearly). Organization is $19/user/month and unlocks SSO and row-level permissions for teams that need finer access control." - -#. js-lingui-id: WYgF8M -#: src/platform/routing/static-website-routes.ts -msgid "Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions." -msgstr "Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions." - -#. js-lingui-id: 1YncLF -#: src/sections/testimonials/testimonials.data.ts -msgid "Co-founder at NetZero" -msgstr "Co-founder at NetZero" - -#. js-lingui-id: 4QGkvo -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "co-founder of NetZero" -msgstr "co-founder of NetZero" - -#. js-lingui-id: vWaYWP -#: src/case-studies/case-study-catalog.ts -msgid "Co-founder, NetZero" -msgstr "Co-founder, NetZero" - -#. js-lingui-id: dcLsG5 -#: src/partner-application/data/partner-country-options.ts -msgid "Colombia 🇨🇴" -msgstr "Colombia 🇨🇴" - -#. js-lingui-id: b5bnuN -#: src/sections/product-feature/feature-tiles.ts -msgid "Column-to-field mapping (including relations)" -msgstr "Column-to-field mapping (including relations)" - -#. js-lingui-id: ofoEsM -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Coming soon!" -msgstr "Coming soon!" - -#. js-lingui-id: KGD9Kt -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Commercial license (no AGPL obligations)" -msgstr "Commercial license (no AGPL obligations)" - -#. js-lingui-id: OnPROL -#: src/partner-application/partner-application-copy.ts -msgid "Commercials" -msgstr "Commercials" - -#. js-lingui-id: chL5IG -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/menu/menu-social.tsx -msgid "Community" -msgstr "Community" - -#. js-lingui-id: 8CLnho -#: src/sections/pricing-plans/plans-data.ts -msgid "Community support" -msgstr "Community support" - -#. js-lingui-id: RxpseA -#: src/partner-application/data/partner-country-options.ts -msgid "Comoros 🇰🇲" -msgstr "Comoros 🇰🇲" - -#. js-lingui-id: SHjhDC -#: src/partner-application/partner-application-copy.ts -msgid "Company or brand *" -msgstr "Company or brand *" - -#. js-lingui-id: Fkb+LW -#: src/sections/three-cards/three-cards.tsx -msgid "Compose your CRM and internal apps with a single extensibility toolkit." -msgstr "Compose your CRM and internal apps with a single extensibility toolkit." - -#. js-lingui-id: kD7ZGH -#: src/sections/stepper/stepper.data.ts -msgid "Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation." -msgstr "Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation." - -#. js-lingui-id: 2DQw7/ -#: src/partner-application/data/partner-country-options.ts -msgid "Congo 🇨🇬" -msgstr "Congo 🇨🇬" - -#. js-lingui-id: iSLIjg -#: src/sections/footer/footer.data.ts -msgid "Connect" -msgstr "Connect" - -#. js-lingui-id: 90KBr0 -#: src/sections/product-feature/feature-tiles.ts -msgid "Connect Google or Microsoft accounts" -msgstr "Connect Google or Microsoft accounts" - -#. js-lingui-id: xgrBCK -#: src/sections/product-feature/feature-tiles.ts -msgid "Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically." -msgstr "Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically." - -#. js-lingui-id: dGwMkb -#: src/platform/releases/release-notes.tsx -msgid "Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team." -msgstr "Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team." - -#. js-lingui-id: MVrQxI -#: src/case-studies/case-study-catalog.ts -msgid "Connected via API" -msgstr "Connected via API" - -#. js-lingui-id: cfAG43 -#: src/case-studies/case-study-catalog.ts -msgid "Consulting" -msgstr "Consulting" - -#. js-lingui-id: GsUBlG -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Contact {partnerName}" -msgstr "Contact {partnerName}" - -#. js-lingui-id: Oii3vg -#: src/sections/product-feature/feature-tiles.ts -msgid "Contacts & Companies" -msgstr "Contacts & Companies" - -#. js-lingui-id: 24qVhV -#: src/sections/product-feature/feature-tiles.ts -msgid "Context lives with the record." -msgstr "Context lives with the record." - -#. js-lingui-id: mXovG/ -#: src/sections/stepper/stepper.data.ts -msgid "Continue iteration *without friction*" -msgstr "Continue iteration *without friction*" - -#. js-lingui-id: LqyWsJ -#: src/platform/releases/release-notes.tsx -msgid "Contributors now have their very own hall of fame." -msgstr "Contributors now have their very own hall of fame." - -#. js-lingui-id: qVH+kL -#: src/platform/releases/release-notes.tsx -msgid "Contributors page" -msgstr "Contributors page" - -#. js-lingui-id: +Uepfb -#: src/case-studies/case-study-stories.ts -msgid "Control" -msgstr "Control" - -#. js-lingui-id: GplbCP -#: src/case-studies/case-study-stories.ts -msgid "Control without *the overhead*" -msgstr "Control without *the overhead*" - -#. js-lingui-id: wH1xmY -#: src/sections/three-cards/three-cards.data.ts -msgid "Control without drag" -msgstr "Control without drag" - -#. js-lingui-id: Bj7igG -#: src/case-studies/case-study-stories.ts -msgid "Control without the overhead" -msgstr "Control without the overhead" - -#. js-lingui-id: PiH3UR -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copied!" -msgstr "Copied!" - -#. js-lingui-id: he3ygx -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy" -msgstr "Copy" - -#. js-lingui-id: 7qTWwB -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy the enterprise key above." -msgstr "Copy the enterprise key above." - -#. js-lingui-id: PXnj76 -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy this key and paste it into your Twenty self-hosted instance settings." -msgstr "Copy this key and paste it into your Twenty self-hosted instance settings." - -#. js-lingui-id: FapWIq -#: src/sections/product-feature/product-feature.tsx -msgid "Core Features" -msgstr "Core Features" - -#. js-lingui-id: Al/blj -#: src/partner-application/data/partner-country-options.ts -msgid "Costa Rica 🇨🇷" -msgstr "Costa Rica 🇨🇷" - -#. js-lingui-id: 1B8JTc -#: src/case-studies/case-study-stories.ts -msgid "Costs down more than *90%*" -msgstr "Costs down more than *90%*" - -#. js-lingui-id: cRA2/z -#: src/partner-application/partner-application-copy.ts -msgid "Country *" -msgstr "Country *" - -#. js-lingui-id: kCu+Rq -#: src/platform/releases/release-notes.tsx -msgid "Create a Kanban view on any object and streamline processes like recruitment or onboarding." -msgstr "Create a Kanban view on any object and streamline processes like recruitment or onboarding." - -#. js-lingui-id: Xn2Nlq -#: src/sections/stepper/product-stepper-data.ts -msgid "Create a workflow" -msgstr "Create a workflow" - -#. js-lingui-id: +kFrvb -#: src/platform/releases/release-notes.tsx -msgid "Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs." -msgstr "Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs." - -#. js-lingui-id: t9znrt -#: src/platform/releases/release-notes.tsx -msgid "Create and organize sidebar items more easily with a cleaner navigation setup." -msgstr "Create and organize sidebar items more easily with a cleaner navigation setup." - -#. js-lingui-id: B9nLrl -#: src/sections/menu/menu.data.ts -msgid "Create apps on Twenty" -msgstr "Create apps on Twenty" - -#. js-lingui-id: yAL7FY -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Create custom apps" -msgstr "Create custom apps" - -#. js-lingui-id: 20ZdFp -#: src/platform/releases/release-notes.tsx -msgid "Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics." -msgstr "Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics." - -#. js-lingui-id: YxktRb -#: src/platform/releases/release-notes.tsx -msgid "Create fields and edit field widgets more directly from record pages." -msgstr "Create fields and edit field widgets more directly from record pages." - -#. js-lingui-id: RRfcjH -#: src/platform/releases/release-notes.tsx -msgid "Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities." -msgstr "Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities." - -#. js-lingui-id: qCRCtk -#: src/platform/releases/release-notes.tsx -msgid "Create more flexible relationships between objects, including more advanced many-to-many setups." -msgstr "Create more flexible relationships between objects, including more advanced many-to-many setups." - -#. js-lingui-id: oS1RiS -#: src/sections/product-feature/feature-tiles.ts -msgid "Create tasks from records" -msgstr "Create tasks from records" - -#. js-lingui-id: D3S5+x -#: src/sections/product-feature/feature-tiles.ts -msgid "Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context." -msgstr "Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context." - -#. js-lingui-id: egTba/ -#: src/platform/releases/release-notes.tsx -msgid "Created By" -msgstr "Created By" - -#. js-lingui-id: ppNnWO -#: src/platform/releases/release-notes.tsx -msgid "Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields." -msgstr "Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields." - -#. js-lingui-id: NLgmM4 -#: src/partner-application/data/partner-scope-options.ts -msgid "CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection" -msgstr "CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection" - -#. js-lingui-id: Y44Xsf -#: src/case-studies/case-study-stories.ts -msgid "CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again." -msgstr "CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again." - -#. js-lingui-id: wDasLa -#: src/sections/three-cards/three-cards.data.ts -msgid "CRM Engineer" -msgstr "CRM Engineer" - -#. js-lingui-id: DqkzNV -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "CRM Engineer, AC&T Education Migration" -msgstr "CRM Engineer, AC&T Education Migration" - -#. js-lingui-id: b7vNti -#: src/sections/why-twenty-hero/why-twenty-hero.tsx -msgid "CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy." -msgstr "CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy." - -#. js-lingui-id: ntHvtU -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "CRM was a ledger. *AI turned it into an operating system.*" -msgstr "CRM was a ledger. *AI turned it into an operating system.*" - -#. js-lingui-id: OACAVp -#: src/partner-application/data/partner-country-options.ts -msgid "Croatia 🇭🇷" -msgstr "Croatia 🇭🇷" - -#. js-lingui-id: I6FFSA -#: src/sections/product-feature/feature-tiles.ts -msgid "CSV export anytime" -msgstr "CSV export anytime" - -#. js-lingui-id: 8RWevB -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "CSV import & export" -msgstr "CSV import & export" - -#. js-lingui-id: s+QiQi -#: src/sections/product-feature/feature-tiles.ts -msgid "CSV import flow" -msgstr "CSV import flow" - -#. js-lingui-id: zyTj4q -#: src/platform/releases/release-notes.tsx -msgid "CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports." -msgstr "CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports." - -#. js-lingui-id: O2UtEV -#: src/partner-application/data/partner-country-options.ts -msgid "Cuba 🇨🇺" -msgstr "Cuba 🇨🇺" - -#. js-lingui-id: auudI+ -#: src/platform/releases/release-notes.tsx -msgid "Currency Field" -msgstr "Currency Field" - -#. js-lingui-id: lh6aPn -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom AI models" -msgstr "Custom AI models" - -#. js-lingui-id: OaTurC -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom apps" -msgstr "Custom apps" - -#. js-lingui-id: TcUCTv -#: src/partner-application/data/partner-scope-options.ts -msgid "Custom Apps · Scripts · AI/agent integrations" -msgstr "Custom Apps · Scripts · AI/agent integrations" - -#. js-lingui-id: onPW5H -#: src/platform/releases/release-notes.tsx -msgid "Custom date formats" -msgstr "Custom date formats" - -#. js-lingui-id: yBSEtR -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom deal stages for your process" -msgstr "Custom deal stages for your process" - -#. js-lingui-id: L+b7SB -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality." -msgstr "Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality." - -#. js-lingui-id: DUnke3 -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Custom Development" -msgstr "Custom Development" - -#. js-lingui-id: GAD3Dx -#: src/sections/pricing-plans/plans-data.ts -msgid "Custom domain" -msgstr "Custom domain" - -#. js-lingui-id: Vz1Vq2 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom domain (crm.yourco.com)" -msgstr "Custom domain (crm.yourco.com)" - -#. js-lingui-id: oPwQt4 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom fields" -msgstr "Custom fields" - -#. js-lingui-id: U1RB/7 -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom fields and relationships" -msgstr "Custom fields and relationships" - -#. js-lingui-id: WGKb6T -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom fields, relationships, and a unified timeline for every contact and company in your workspace." -msgstr "Custom fields, relationships, and a unified timeline for every contact and company in your workspace." - -#. js-lingui-id: prIqWa -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom layout" -msgstr "Custom layout" - -#. js-lingui-id: RuYs9T -#: src/platform/releases/release-notes.tsx -msgid "Custom layouts" -msgstr "Custom layouts" - -#. js-lingui-id: 8skTDV -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom objects" -msgstr "Custom objects" - -#. js-lingui-id: y5pLQH -#: src/platform/releases/release-notes.tsx -msgid "Custom sidebar" -msgstr "Custom sidebar" - -#. js-lingui-id: AbyZbl -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom views" -msgstr "Custom views" - -#. js-lingui-id: 5xK1jE -#: src/sections/helped/helped-scene.tsx -#: src/sections/case-study-catalog/case-study-catalog-grid.tsx -msgid "Customer stories" -msgstr "Customer stories" - -#. js-lingui-id: YjXLAQ -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Customer Stories" -msgstr "Customer Stories" - -#. js-lingui-id: BavWCk -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Customer stories preview" -msgstr "Customer stories preview" - -#. js-lingui-id: 0fgCyk -#: src/sections/case-study-detail/case-study-hero.tsx -msgid "Customer story" -msgstr "Customer story" - -#. js-lingui-id: zKLqOg -#: src/app/[locale]/(site)/customers/[slug]/page.tsx -msgid "Customer story not found — Twenty" -msgstr "Customer story not found — Twenty" - -#. js-lingui-id: NihQNk -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Customers" -msgstr "Customers" - -#. js-lingui-id: qqLY+j -#: src/sections/stepper/product-stepper-content.tsx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Customization" -msgstr "Customization" - -#. js-lingui-id: GRfLAg -#: src/case-studies/case-study-catalog.ts -msgid "Customizations" -msgstr "Customizations" - -#. js-lingui-id: dy0yuR -#: src/platform/releases/release-notes.tsx -msgid "Customize your sub-domain" -msgstr "Customize your sub-domain" - -#. js-lingui-id: Pj5fGG -#: src/partner-application/data/partner-country-options.ts -msgid "Cyprus 🇨🇾" -msgstr "Cyprus 🇨🇾" - -#. js-lingui-id: w9VTXG -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Czech" -msgstr "Czech" - -#. js-lingui-id: xkuHM6 -#: src/partner-application/data/partner-country-options.ts -msgid "Czech Republic 🇨🇿" -msgstr "Czech Republic 🇨🇿" - -#. js-lingui-id: 4RLD4p -#: src/case-studies/case-study-catalog.ts -msgid "Daily messages" -msgstr "Daily messages" - -#. js-lingui-id: Fo2vDn -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Danish" -msgstr "Danish" - -#. js-lingui-id: aebTao -#: src/platform/releases/release-notes.tsx -msgid "Dashboards in Labs (Beta)" -msgstr "Dashboards in Labs (Beta)" - -#. js-lingui-id: V0kvgB -#: src/sections/product-feature/feature-tiles.ts -msgid "Data import" -msgstr "Data import" - -#. js-lingui-id: 5cNMFz -#: src/sections/stepper/product-stepper-data.ts -msgid "Data model" -msgstr "Data model" - -#. js-lingui-id: ZEsvS2 -#: src/platform/releases/release-notes.tsx -msgid "Data Model Diagram" -msgstr "Data Model Diagram" - -#. js-lingui-id: iq2WTm -#: src/partner-application/data/partner-scope-options.ts -msgid "Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations" -msgstr "Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations" - -#. js-lingui-id: dSuMNg -#: src/platform/releases/release-notes.tsx -msgid "Datetime Field" -msgstr "Datetime Field" - -#. js-lingui-id: /TlpVf -#: src/sections/product-feature/feature-tiles.ts -msgid "Deals that move themselves." -msgstr "Deals that move themselves." - -#. js-lingui-id: H1UtjM -#: src/partner-application/data/partner-country-options.ts -msgid "Denmark 🇩🇰" -msgstr "Denmark 🇩🇰" - -#. js-lingui-id: tqbpyT -#: src/platform/releases/release-notes.tsx -msgid "Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting." -msgstr "Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting." - -#. js-lingui-id: X5B6sd -#: src/sections/helped/helped-scene.tsx -msgid "Dev teams power company-wide *change with Twenty*" -msgstr "Dev teams power company-wide *change with Twenty*" - -#. js-lingui-id: n+SX4g -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Developers" -msgstr "Developers" - -#. js-lingui-id: 5atXgh -#: src/platform/releases/release-notes.tsx -msgid "Developers can now take advantage of the new array field type to store non-predefined values." -msgstr "Developers can now take advantage of the new array field type to store non-predefined values." - -#. js-lingui-id: canH5K -#: src/platform/releases/release-notes.tsx -msgid "Developers can now use webhooks to synchronize customer data updates in real-time across applications." -msgstr "Developers can now use webhooks to synchronize customer data updates in real-time across applications." - -#. js-lingui-id: ohFj56 -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Differentiation now *lives in the code you own.*" -msgstr "Differentiation now *lives in the code you own.*" - -#. js-lingui-id: Wuqvfz -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "Director of Digital and Information, Elevate Consulting" -msgstr "Director of Digital and Information, Elevate Consulting" - -#. js-lingui-id: gW1L7t -#: src/case-studies/case-study-stories.ts -msgid "Director, W3villa Technologies, Partner" -msgstr "Director, W3villa Technologies, Partner" - -#. js-lingui-id: 30qcNY -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "Discord (opens in new tab)" -msgstr "Discord (opens in new tab)" - -#. js-lingui-id: old0Lj -#: src/sections/releases-hero/releases-hero.tsx -msgid "Discover the newest features and improvements in Twenty, the #1 Open Source CRM." -msgstr "Discover the newest features and improvements in Twenty, the #1 Open Source CRM." - -#. js-lingui-id: W+b/DF -#: src/sections/menu/menu.data.ts -msgid "Discover what's new" -msgstr "Discover what's new" - -#. js-lingui-id: rHLwDO -#: src/partner-application/data/partner-country-options.ts -msgid "Djibouti 🇩🇯" -msgstr "Djibouti 🇩🇯" - -#. js-lingui-id: Zjjbne -#: src/sections/faq/faq.data.ts -msgid "Do I need a developer to customize Twenty?" -msgstr "Do I need a developer to customize Twenty?" - -#. js-lingui-id: Zx22Ih -#: src/sections/faq/faq.data.ts -msgid "Does Twenty work with Claude, ChatGPT, and Cursor?" -msgstr "Does Twenty work with Claude, ChatGPT, and Cursor?" - -#. js-lingui-id: bMDnQR -#: src/partner-application/data/partner-country-options.ts -msgid "Dominica 🇩🇲" -msgstr "Dominica 🇩🇲" - -#. js-lingui-id: ufcRA6 -#: src/partner-application/data/partner-country-options.ts -msgid "Dominican Republic 🇩🇴" -msgstr "Dominican Republic 🇩🇴" - -#. js-lingui-id: pOLPPB -#: src/sections/stepper/stepper.data.ts -msgid "Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling." -msgstr "Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling." - -#. js-lingui-id: HDR0en -#: src/partner-application/data/partner-country-options.ts -msgid "DR Congo 🇨🇩" -msgstr "DR Congo 🇨🇩" - -#. js-lingui-id: mzedFr -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Draft a workflow for an email sequence" -msgstr "Draft a workflow for an email sequence" - -#. js-lingui-id: q7M3jo -#: src/platform/releases/release-notes.tsx -msgid "Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works." -msgstr "Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works." - -#. js-lingui-id: fPma12 -#: src/sections/product-feature/feature-tiles.ts -msgid "Drag-and-drop deals between stages" -msgstr "Drag-and-drop deals between stages" - -#. js-lingui-id: KIjvtr -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Dutch" -msgstr "Dutch" - -#. js-lingui-id: 6r6pDf -#: src/partner-application/partner-application-copy.ts -msgid "e.g. React, Postgres, n8n…" -msgstr "e.g. React, Postgres, n8n…" - -#. js-lingui-id: a35sCN -#: src/platform/releases/release-notes.tsx -msgid "Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain." -msgstr "Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain." - -#. js-lingui-id: s+5p5k -#: src/platform/releases/release-notes.tsx -msgid "Easier field editing" -msgstr "Easier field editing" - -#. js-lingui-id: nKXMzJ -#: src/platform/releases/release-notes.tsx -msgid "Easier layouts" -msgstr "Easier layouts" - -#. js-lingui-id: hEtClO -#: src/partner-application/data/partner-country-options.ts -msgid "Ecuador 🇪🇨" -msgstr "Ecuador 🇪🇨" - -#. js-lingui-id: 4CJ4xV -#: src/case-studies/case-study-catalog.ts -msgid "EdTech" -msgstr "EdTech" - -#. js-lingui-id: aqxYLv -#: src/case-studies/case-study-catalog.ts -msgid "Education" -msgstr "Education" - -#. js-lingui-id: OAdXUT -#: src/partner-application/data/partner-country-options.ts -msgid "Egypt 🇪🇬" -msgstr "Egypt 🇪🇬" - -#. js-lingui-id: 2xK+An -#: src/partner-application/data/partner-country-options.ts -msgid "El Salvador 🇸🇻" -msgstr "El Salvador 🇸🇻" - -#. js-lingui-id: 1wTjWx -#: src/case-studies/case-study-stories.ts -msgid "Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth." -msgstr "Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth." - -#. js-lingui-id: 2THY70 -#: src/case-studies/case-study-catalog.ts -msgid "Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data." -msgstr "Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data." - -#. js-lingui-id: wiTeYI -#: src/case-studies/case-study-stories.ts -msgid "Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs." -msgstr "Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs." - -#. js-lingui-id: FNyrb0 -#: src/sections/product-feature/feature-tiles.ts -msgid "Email & Calendar" -msgstr "Email & Calendar" - -#. js-lingui-id: jTgK6B -#: src/platform/releases/release-notes.tsx -msgid "Email and calendar Blocklist" -msgstr "Email and calendar Blocklist" - -#. js-lingui-id: AoN898 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Email and Chat" -msgstr "Email and Chat" - -#. js-lingui-id: rc8HEz -#: src/platform/releases/release-notes.tsx -msgid "Email replies" -msgstr "Email replies" - -#. js-lingui-id: ObCvfI -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Email sharing" -msgstr "Email sharing" - -#. js-lingui-id: 7o9obN -#: src/platform/releases/release-notes.tsx -msgid "Email thread widgets and an inline reply composer make it easier to work directly from messaging records." -msgstr "Email thread widgets and an inline reply composer make it easier to work directly from messaging records." - -#. js-lingui-id: hfqiVr -#: src/sections/product-feature/feature-tiles.ts -msgid "Email/calendar activity on each record" -msgstr "Email/calendar activity on each record" - -#. js-lingui-id: XGd8Wo -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Emails & Calendar" -msgstr "Emails & Calendar" - -#. js-lingui-id: o4/9l1 -#: src/sections/product-feature/feature-tiles.ts -msgid "Emails and events linked to CRM records" -msgstr "Emails and events linked to CRM records" - -#. js-lingui-id: QOINDn -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "empty" -msgstr "empty" - -#. js-lingui-id: ZxDrUL -#: src/platform/releases/release-notes.tsx -msgid "Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!" -msgstr "Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!" - -#. js-lingui-id: jkaFcU -#: src/platform/releases/release-notes.tsx -msgid "Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in." -msgstr "Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in." - -#. js-lingui-id: Qpn/bX -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Encrypt your data" -msgstr "Encrypt your data" - -#. js-lingui-id: Iy8Gze -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Encryption key rotation" -msgstr "Encryption key rotation" - -#. js-lingui-id: lYGfRP -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "English" -msgstr "English" - -#. js-lingui-id: pNNVhg -#: src/platform/releases/release-notes.tsx -msgid "Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication." -msgstr "Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication." - -#. js-lingui-id: kZ17+i -#: src/platform/releases/release-notes.tsx -msgid "Enhance your data handling capabilities with the addition of four new field types:" -msgstr "Enhance your data handling capabilities with the addition of four new field types:" - -#. js-lingui-id: CVqFAV -#: src/platform/releases/release-notes.tsx -msgid "Enhanced Kanban Board" -msgstr "Enhanced Kanban Board" - -#. js-lingui-id: LKTMHa -#: src/platform/releases/release-notes.tsx -msgid "Enhanced One-to-Many Relations Editing" -msgstr "Enhanced One-to-Many Relations Editing" - -#. js-lingui-id: ovz6sZ -#: src/platform/releases/release-notes.tsx -msgid "Enhanced Timeline" -msgstr "Enhanced Timeline" - -#. js-lingui-id: Ijh+h+ -#: src/sections/stepper/stepper.data.ts -msgid "Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins." -msgstr "Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins." - -#. js-lingui-id: xoqD/n -#: src/partner-application/partner-application-copy.ts -msgid "Enter a valid email address." -msgstr "Enter a valid email address." - -#. js-lingui-id: /OVUD6 -#: src/partner-application/partner-application-copy.ts -msgid "Enter a valid URL (starting with http:// or https://)." -msgstr "Enter a valid URL (starting with http:// or https://)." - -#. js-lingui-id: 87BcPj -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Enterprise *activation*" -msgstr "Enterprise *activation*" - -#. js-lingui-id: NTskGY -#: src/platform/routing/static-website-routes.ts -msgid "Enterprise Activation | Twenty" -msgstr "Enterprise Activation | Twenty" - -#. js-lingui-id: 3dQ6zJ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Environments" -msgstr "Environments" - -#. js-lingui-id: c0nqfC -#: src/partner-application/data/partner-country-options.ts -msgid "Equatorial Guinea 🇬🇶" -msgstr "Equatorial Guinea 🇬🇶" - -#. js-lingui-id: 4DIpFY -#: src/partner-application/data/partner-country-options.ts -msgid "Eritrea 🇪🇷" -msgstr "Eritrea 🇪🇷" - -#. js-lingui-id: JIhNLR -#: src/partner-application/data/partner-country-options.ts -msgid "Estonia 🇪🇪" -msgstr "Estonia 🇪🇪" - -#. js-lingui-id: 8yXuJ9 -#: src/partner-application/data/partner-country-options.ts -msgid "Eswatini 🇸🇿" -msgstr "Eswatini 🇸🇿" - -#. js-lingui-id: rktGGp -#: src/partner-application/data/partner-country-options.ts -msgid "Ethiopia 🇪🇹" -msgstr "Ethiopia 🇪🇹" - -#. js-lingui-id: rQqP1P -#: src/partners-marketplace/served-geo-labels.ts -msgid "Europe" -msgstr "Europe" - -#. js-lingui-id: IhKZhp -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Even the training material is a feature worth celebrating." -msgstr "Even the training material is a feature worth celebrating." - -#. js-lingui-id: sQP1sF -#: src/platform/routing/static-website-routes.ts -msgid "Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most." -msgstr "Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most." - -#. js-lingui-id: rkZTD7 -#: src/sections/product-feature/feature-tiles.ts -msgid "Every thread, on the right record." -msgstr "Every thread, on the right record." - -#. js-lingui-id: kz/8m8 -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Everything in Pro" -msgstr "Everything in Pro" - -#. js-lingui-id: zoNk7e -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Everything updates in real time, with AI chat always ready to help you move faster." -msgstr "Everything updates in real time, with AI chat always ready to help you move faster." - -#. js-lingui-id: /g9UKY -#: src/sections/product-feature/product-feature.tsx -msgid "Everything you need, *out of the box*" -msgstr "Everything you need, *out of the box*" - -#. js-lingui-id: 2NGXKo -#: src/platform/releases/release-notes.tsx -msgid "Expanded support for 30+ languages, so users can navigate and use the software in their preferred language." -msgstr "Expanded support for 30+ languages, so users can navigate and use the software in their preferred language." - -#. js-lingui-id: 14xdUh -#: src/platform/releases/release-notes.tsx -msgid "Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization." -msgstr "Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization." - -#. js-lingui-id: 57gG1f -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Experience enterprise-grade granularity, starting with an 11th permission." -msgstr "Experience enterprise-grade granularity, starting with an 11th permission." - -#. js-lingui-id: uZRQi+ -#: src/partner-application/partner-application-copy.ts -msgid "Expertise & experience" -msgstr "Expertise & experience" - -#. js-lingui-id: JTM5zS -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Explore customer stories" -msgstr "Explore customer stories" - -#. js-lingui-id: weFouS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Extended run!" -msgstr "Extended run!" - -#. js-lingui-id: tX4pRm -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Failed to activate enterprise key. Please try again." -msgstr "Failed to activate enterprise key. Please try again." - -#. js-lingui-id: akLvep -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Familiar, modern interface" -msgstr "Familiar, modern interface" - -#. js-lingui-id: gKNP7S -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Farsi" -msgstr "Farsi" - -#. js-lingui-id: abO45l -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Fast path to action" -msgstr "Fast path to action" - -#. js-lingui-id: idFRAo -#: src/platform/releases/release-notes.tsx -msgid "Faster field setup" -msgstr "Faster field setup" - -#. js-lingui-id: 3qy0z4 -#: src/platform/releases/release-notes.tsx -msgid "Favorites now live in the navigation menu, making the sidebar easier to organize and customize." -msgstr "Favorites now live in the navigation menu, making the sidebar easier to organize and customize." - -#. js-lingui-id: JrTb6F -#: src/platform/releases/release-notes.tsx -msgid "Favorites Views and Favorites Folders" -msgstr "Favorites Views and Favorites Folders" - -#. js-lingui-id: +LREeu -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "feature" -msgstr "feature" - -#. js-lingui-id: hXRm6J -#: src/platform/releases/release-notes.tsx -msgid "Field Level Permission" -msgstr "Field Level Permission" - -#. js-lingui-id: 3Y3//3 -#: src/platform/releases/release-notes.tsx -msgid "Field widgets" -msgstr "Field widgets" - -#. js-lingui-id: QDxnW/ -#: src/platform/releases/release-notes.tsx -msgid "Field widgets are easier to configure directly from the page where you use them." -msgstr "Field widgets are easier to configure directly from the page where you use them." - -#. js-lingui-id: 5SV9rS -#: src/platform/releases/release-notes.tsx -msgid "Field widgets now support more relation types, so custom layouts work better across more objects." -msgstr "Field widgets now support more relation types, so custom layouts work better across more objects." - -#. js-lingui-id: e6BgMV -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Field-level permissions" -msgstr "Field-level permissions" - -#. js-lingui-id: z+q1Th -#: src/partner-application/data/partner-country-options.ts -msgid "Fiji 🇫🇯" -msgstr "Fiji 🇫🇯" - -#. js-lingui-id: sER+bs -#: src/sections/product-feature/feature-tiles.ts -msgid "Files" -msgstr "Files" - -#. js-lingui-id: jxbpA9 -#: src/platform/releases/release-notes.tsx -msgid "Files in records" -msgstr "Files in records" - -#. js-lingui-id: 1t0xRH -#: src/platform/releases/release-notes.tsx -msgid "Filter by Multi-Select" -msgstr "Filter by Multi-Select" - -#. js-lingui-id: bOidm7 -#: src/partners-marketplace/filter-bar.tsx -msgid "Filter partners" -msgstr "Filter partners" - -#. js-lingui-id: kUUNrw -#: src/platform/releases/release-notes.tsx -msgid "Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company." -msgstr "Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company." - -#. js-lingui-id: iabLgo -#: src/sections/product-feature/feature-tiles.ts -msgid "Filtered metrics from any object" -msgstr "Filtered metrics from any object" - -#. js-lingui-id: sRUAXp -#: src/platform/routing/static-website-routes.ts -msgid "Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us." -msgstr "Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us." - -#. js-lingui-id: TJ7HQl -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/partner-hero/partner-hero.tsx -msgid "Find a partner" -msgstr "Find a partner" - -#. js-lingui-id: MD032e -#: src/sections/menu/menu.data.ts -msgid "Find a Twenty partner" -msgstr "Find a Twenty partner" - -#. js-lingui-id: S6CEQ9 -#: src/platform/routing/static-website-routes.ts -msgid "Find a Twenty Partner — Open Source CRM Marketplace" -msgstr "Find a Twenty Partner — Open Source CRM Marketplace" - -#. js-lingui-id: wHyJkT -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -msgid "Find the right partner to implement, customize, and tailor Twenty to your team." -msgstr "Find the right partner to implement, customize, and tailor Twenty to your team." - -#. js-lingui-id: 5asqas -#: src/partners-marketplace/marketplace-header.tsx -msgid "Find your *Twenty partner*" -msgstr "Find your *Twenty partner*" - -#. js-lingui-id: 9V48qi -#: src/partner-application/data/partner-country-options.ts -msgid "Finland 🇫🇮" -msgstr "Finland 🇫🇮" - -#. js-lingui-id: USZ2N6 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Finnish" -msgstr "Finnish" - -#. js-lingui-id: PHM5wp -#: src/case-studies/case-study-stories.ts -msgid "Flexibility" -msgstr "Flexibility" - -#. js-lingui-id: YsFkku -#: src/platform/releases/release-notes.tsx -msgid "Flexible relations" -msgstr "Flexible relations" - -#. js-lingui-id: HBJ0P5 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"Flow\n" -"orchestration" -msgstr "" -"Flow\n" -"orchestration" - -#. js-lingui-id: obrJBN -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Fly through your workspace with shortcuts and short load times." -msgstr "Fly through your workspace with shortcuts and short load times." - -#. js-lingui-id: HjFq2b -#: src/case-studies/case-study-stories.ts -msgid "Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute." -msgstr "Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute." - -#. js-lingui-id: mjIRMF -#: src/case-studies/case-study-stories.ts -msgid "Focus on the use case, not the *plumbing*" -msgstr "Focus on the use case, not the *plumbing*" - -#. js-lingui-id: P5E+kT -#: src/case-studies/case-study-stories.ts -msgid "Focus on the use case, not the plumbing" -msgstr "Focus on the use case, not the plumbing" - -#. js-lingui-id: wdVyxi -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Folder/Label import" -msgstr "Folder/Label import" - -#. js-lingui-id: qwJuVW -#: src/sections/footer/footer-nav.tsx -msgid "Footer" -msgstr "Footer" - -#. js-lingui-id: CKQ0za -#: src/case-studies/case-study-stories.ts -msgid "For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation." -msgstr "For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation." - -#. js-lingui-id: yAJC9c -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it." -msgstr "For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it." - -#. js-lingui-id: UCoxP5 -#: src/sections/testimonials/partner-testimonials.data.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "Founder, Nine Dots Ventures" -msgstr "Founder, Nine Dots Ventures" - -#. js-lingui-id: IPaRlc -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Founder, Wintactix" -msgstr "Founder, Wintactix" - -#. js-lingui-id: 671GY5 -#: src/partner-application/data/partner-country-options.ts -msgid "France 🇫🇷" -msgstr "France 🇫🇷" - -#. js-lingui-id: tUgSXd -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Free for you!" -msgstr "Free for you!" - -#. js-lingui-id: nLC6tu -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "French" -msgstr "French" - -#. js-lingui-id: weRlb1 -#: src/partners-marketplace/partner-money-row.tsx -msgid "from {minBudget}" -msgstr "from {minBudget}" - -#. js-lingui-id: Iuxc00 -#: src/sections/product-feature/feature-tiles.ts -msgid "From CSV to CRM in minutes." -msgstr "From CSV to CRM in minutes." - -#. js-lingui-id: Mxpask -#: src/case-studies/case-study-stories.ts -msgid "From documents to *open APIs*" -msgstr "From documents to *open APIs*" - -#. js-lingui-id: emeKZ7 -#: src/case-studies/case-study-stories.ts -msgid "From documents to open APIs" -msgstr "From documents to open APIs" - -#. js-lingui-id: 2CtZ6T -#: src/case-studies/case-study-stories.ts -msgid "" -"From Salesforce to\n" -"*self-hosted Twenty*" -msgstr "" -"From Salesforce to\n" -"*self-hosted Twenty*" - -#. js-lingui-id: kl+hEJ -#: src/case-studies/case-study-catalog.ts -msgid "From Salesforce to self-hosted Twenty" -msgstr "From Salesforce to self-hosted Twenty" - -#. js-lingui-id: syU/BD -#: src/case-studies/case-study-stories.ts -msgid "From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners" -msgstr "From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners" - -#. js-lingui-id: UfoVki -#: src/case-studies/case-study-stories.ts -msgid "From simple to *advanced*" -msgstr "From simple to *advanced*" - -#. js-lingui-id: Lf7cb3 -#: src/case-studies/case-study-stories.ts -msgid "From simple to advanced" -msgstr "From simple to advanced" - -#. js-lingui-id: m1I5TY -#: src/sections/product-feature/feature-tiles.ts -msgid "Full communication history in one place" -msgstr "Full communication history in one place" - -#. js-lingui-id: wXgKOm -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Full customization" -msgstr "Full customization" - -#. js-lingui-id: YZ7Q3Z -#: src/case-studies/case-study-catalog.ts -msgid "Full ownership" -msgstr "Full ownership" - -#. js-lingui-id: hdxwWi -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Fully customizable" -msgstr "Fully customizable" - -#. js-lingui-id: //hrfs -#: src/partner-application/data/partner-country-options.ts -msgid "Gabon 🇬🇦" -msgstr "Gabon 🇬🇦" - -#. js-lingui-id: yau9J6 -#: src/partner-application/data/partner-country-options.ts -msgid "Gambia 🇬🇲" -msgstr "Gambia 🇬🇲" - -#. js-lingui-id: S84RWl -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Generate tasks for my top 10 accounts" -msgstr "Generate tasks for my top 10 accounts" - -#. js-lingui-id: GOmD9p -#: src/partner-application/data/partner-country-options.ts -msgid "Georgia 🇬🇪" -msgstr "Georgia 🇬🇪" - -#. js-lingui-id: DDcvSo -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "German" -msgstr "German" - -#. js-lingui-id: XcPIuI -#: src/partner-application/data/partner-country-options.ts -msgid "Germany 🇩🇪" -msgstr "Germany 🇩🇪" - -#. js-lingui-id: ZDIydz -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -#: src/sections/product-hero/product-hero.tsx -#: src/sections/menu/menu.tsx -#: src/sections/menu/menu.tsx -#: src/sections/home-hero/home-hero.tsx -#: src/sections/footer/footer.data.ts -#: src/sections/faq/faq.tsx -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "Get started" -msgstr "Get started" - -#. js-lingui-id: xyKSqi -#: src/partner-application/data/partner-country-options.ts -msgid "Ghana 🇬🇭" -msgstr "Ghana 🇬🇭" - -#. js-lingui-id: 3QRTgQ -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "GitHub (opens in new tab)" -msgstr "GitHub (opens in new tab)" - -#. js-lingui-id: wuH0g5 -#: src/platform/releases/release-notes.tsx -msgid "Gmail integration" -msgstr "Gmail integration" - -#. js-lingui-id: n8waaJ -#: src/sections/stepper/product-stepper-content.tsx -msgid "Go the extra mile *with no-code*" -msgstr "Go the extra mile *with no-code*" - -#. js-lingui-id: Ay/vbT -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Good choice!" -msgstr "Good choice!" - -#. js-lingui-id: opD7oA -#: src/platform/releases/release-notes.tsx -msgid "Google Calendar Integration" -msgstr "Google Calendar Integration" - -#. js-lingui-id: Zh0acB -#: src/partner-application/partner-application-copy.ts -msgid "Grab 30 minutes so we can get to know your team." -msgstr "Grab 30 minutes so we can get to know your team." - -#. js-lingui-id: 1W3PAd -#: src/platform/releases/release-notes.tsx -msgid "Granular Email Folder Sync" -msgstr "Granular Email Folder Sync" - -#. js-lingui-id: +tDN2S -#: src/partner-application/data/partner-country-options.ts -msgid "Greece 🇬🇷" -msgstr "Greece 🇬🇷" - -#. js-lingui-id: CZXzs4 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Greek" -msgstr "Greek" - -#. js-lingui-id: DDgHcm -#: src/partner-application/data/partner-country-options.ts -msgid "Grenada 🇬🇩" -msgstr "Grenada 🇬🇩" - -#. js-lingui-id: MCLWq4 -#: src/sections/helped/helped.data.ts -msgid "Grow with a flexible foundation" -msgstr "Grow with a flexible foundation" - -#. js-lingui-id: M/8CC1 -#: src/partner-application/data/partner-country-options.ts -msgid "Guatemala 🇬🇹" -msgstr "Guatemala 🇬🇹" - -#. js-lingui-id: UZbq7J -#: src/partner-application/data/partner-country-options.ts -msgid "Guinea 🇬🇳" -msgstr "Guinea 🇬🇳" - -#. js-lingui-id: vtpxPx -#: src/partner-application/data/partner-country-options.ts -msgid "Guinea-Bissau 🇬🇼" -msgstr "Guinea-Bissau 🇬🇼" - -#. js-lingui-id: GT8Ua2 -#: src/partner-application/data/partner-country-options.ts -msgid "Guyana 🇬🇾" -msgstr "Guyana 🇬🇾" - -#. js-lingui-id: 5BLiJj -#: src/partner-application/data/partner-country-options.ts -msgid "Haiti 🇭🇹" -msgstr "Haiti 🇭🇹" - -#. js-lingui-id: Xf5EJg -#: src/sections/footer/footer.data.ts -msgid "Halftone generator" -msgstr "Halftone generator" - -#. js-lingui-id: DHC85F -#: src/platform/routing/static-website-routes.ts -msgid "Halftone Generator | Twenty" -msgstr "Halftone Generator | Twenty" - -#. js-lingui-id: c3XJ18 -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -#: src/sections/footer/footer.data.ts -msgid "Help" -msgstr "Help" - -#. js-lingui-id: CRzGla -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Help center" -msgstr "Help center" - -#. js-lingui-id: LiWOgh -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Hey, I'm interested in meeting. Here's my project:" -msgstr "Hey, I'm interested in meeting. Here's my project:" - -#. js-lingui-id: EhWatX -#: src/app-preview/terminal/diff/diff-pill.tsx -msgid "Hide changes" -msgstr "Hide changes" - -#. js-lingui-id: tGjibo -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Hindi" -msgstr "Hindi" - -#. js-lingui-id: qfSbUb -#: src/case-studies/case-study-stories.ts -msgid "His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix." -msgstr "His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix." - -#. js-lingui-id: i0qMbr -#: src/sections/menu/menu.tsx -#: src/sections/footer/footer.data.ts -msgid "Home" -msgstr "Home" - -#. js-lingui-id: CtU7yU -#: src/case-studies/case-study-stories.ts -msgid "Homeseller" -msgstr "Homeseller" - -#. js-lingui-id: KYnPnU -#: src/case-studies/case-study-stories.ts -msgid "Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together." -msgstr "Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together." - -#. js-lingui-id: v6cmMq -#: src/case-studies/case-study-stories.ts -msgid "Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time." -msgstr "Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time." - -#. js-lingui-id: xaIV9m -#: src/case-studies/case-study-stories.ts -msgid "Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty" -msgstr "Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty" - -#. js-lingui-id: zbfmqm -#: src/partner-application/data/partner-country-options.ts -msgid "Honduras 🇭🇳" -msgstr "Honduras 🇭🇳" - -#. js-lingui-id: mqX9AX -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Hosting & Infrastructure" -msgstr "Hosting & Infrastructure" - -#. js-lingui-id: SHZNBm -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Hourly" -msgstr "Hourly" - -#. js-lingui-id: Ivq5+7 -#: src/partner-application/partner-application-copy.ts -msgid "Hourly rate" -msgstr "Hourly rate" - -#. js-lingui-id: XnFo3G -#: src/case-studies/case-study-stories.ts -msgid "How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership." -msgstr "How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership." - -#. js-lingui-id: PYi0f6 -#: src/case-studies/case-study-stories.ts -msgid "How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership." -msgstr "How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership." - -#. js-lingui-id: +MLOVo -#: src/case-studies/case-study-stories.ts -msgid "How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack." -msgstr "How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack." - -#. js-lingui-id: OIwpKt -#: src/sections/faq/faq.data.ts -msgid "How long does it take to get started?" -msgstr "How long does it take to get started?" - -#. js-lingui-id: iRzy9e -#: src/case-studies/case-study-stories.ts -msgid "How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows." -msgstr "How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows." - -#. js-lingui-id: NZYA4S -#: src/case-studies/case-study-stories.ts -msgid "How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day." -msgstr "How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day." - -#. js-lingui-id: 5sWcC0 -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "" -"How teams\n" -"*built with Twenty*" -msgstr "" -"How teams\n" -"*built with Twenty*" - -#. js-lingui-id: Z3Cabh -#: src/platform/routing/static-website-routes.ts -msgid "How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy." -msgstr "How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy." - -#. js-lingui-id: URQPvK -#: src/case-studies/case-study-stories.ts -msgid "How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone." -msgstr "How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone." - -#. js-lingui-id: htrFcw -#: src/partner-application/data/partner-country-options.ts -msgid "Hungary 🇭🇺" -msgstr "Hungary 🇭🇺" - -#. js-lingui-id: T6wyby -#: src/partner-application/partner-application-copy.ts -msgid "I'll book later →" -msgstr "I'll book later →" - -#. js-lingui-id: RYDa0v -#: src/partner-application/data/partner-country-options.ts -msgid "Iceland 🇮🇸" -msgstr "Iceland 🇮🇸" - -#. js-lingui-id: ePYQjq -#: src/partner-application/partner-application-copy.ts -msgid "Identity" -msgstr "Identity" - -#. js-lingui-id: Grur3I -#: src/platform/releases/release-notes.tsx -msgid "IMAP" -msgstr "IMAP" - -#. js-lingui-id: l0JGUk -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Impersonate users" -msgstr "Impersonate users" - -#. js-lingui-id: N4OVNn -#: src/case-studies/case-study-stories.ts -msgid "Implementation" -msgstr "Implementation" - -#. js-lingui-id: yHueLx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Implementation partners" -msgstr "Implementation partners" - -#. js-lingui-id: 9P1c4k -#: src/platform/releases/release-notes.tsx -msgid "Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched." -msgstr "Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched." - -#. js-lingui-id: WxaeWx -#: src/platform/releases/release-notes.tsx -msgid "Import Relations" -msgstr "Import Relations" - -#. js-lingui-id: BHNxPe -#: src/platform/releases/release-notes.tsx -msgid "Import V2" -msgstr "Import V2" - -#. js-lingui-id: ZAKTS6 -#: src/sections/product-feature/feature-tiles.ts -msgid "Import your data with field mapping, including relations. Export anytime — your data is always yours." -msgstr "Import your data with field mapping, including relations. Export anytime — your data is always yours." - -#. js-lingui-id: cCwGqi -#: src/platform/releases/release-notes.tsx -msgid "Improved Onboarding Experience" -msgstr "Improved Onboarding Experience" - -#. js-lingui-id: 86Q2Qb -#: src/platform/releases/release-notes.tsx -msgid "Improved Performance" -msgstr "Improved Performance" - -#. js-lingui-id: InyU0Z -#: src/case-studies/case-study-stories.ts -msgid "In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect." -msgstr "In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect." - -#. js-lingui-id: d1Aru8 -#: src/sections/helped/helped-scene.tsx -msgid "In production." -msgstr "In production." - -#. js-lingui-id: Sqb+jp -#: src/sections/product-feature/feature-tiles.ts -msgid "In-app preview for supported file types (when enabled)" -msgstr "In-app preview for supported file types (when enabled)" - -#. js-lingui-id: 3XP8Lk -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Included!" -msgstr "Included!" - -#. js-lingui-id: /c4yUr -#: src/partner-application/data/partner-country-options.ts -msgid "India 🇮🇳" -msgstr "India 🇮🇳" - -#. js-lingui-id: iEJqDi -#: src/partner-application/data/partner-country-options.ts -msgid "Indonesia 🇮🇩" -msgstr "Indonesia 🇮🇩" - -#. js-lingui-id: BQukYF -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Indonesian" -msgstr "Indonesian" - -#. js-lingui-id: S8gy7K -#: src/sections/case-study-detail/case-study-highlights.tsx -msgid "Industry" -msgstr "Industry" - -#. js-lingui-id: MeL8SS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Infinite scroll" -msgstr "Infinite scroll" - -#. js-lingui-id: +mOisw -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Infinite scroll is still coming soon, unlike the invoice." -msgstr "Infinite scroll is still coming soon, unlike the invoice." - -#. js-lingui-id: K8iwJx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Install shared tarball app" -msgstr "Install shared tarball app" - -#. js-lingui-id: AHWM9N -#: src/case-studies/case-study-stories.ts -msgid "Integration" -msgstr "Integration" - -#. js-lingui-id: OChKCc -#: src/platform/routing/static-website-routes.ts -msgid "Interactive halftone generator exported from Twenty." -msgstr "Interactive halftone generator exported from Twenty." - -#. js-lingui-id: +83cJG -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Interested in meeting {partnerName}" -msgstr "Interested in meeting {partnerName}" - -#. js-lingui-id: MAqMna -#: src/platform/releases/release-notes.tsx -msgid "Internal Email Privacy" -msgstr "Internal Email Privacy" - -#. js-lingui-id: 0ysJ3C -#: src/platform/releases/release-notes.tsx -msgid "Internal team emails won't sync, protecting privacy by preventing access to internal discussions." -msgstr "Internal team emails won't sync, protecting privacy by preventing access to internal discussions." - -#. js-lingui-id: a+PGuG -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Internet accounts per user" -msgstr "Internet accounts per user" - -#. js-lingui-id: 87rKhU -#: src/platform/releases/release-notes.tsx -msgid "Introduced a \"Data Model Diagram\" feature that allows users to visualize the relationships between different objects within the CRM." -msgstr "Introduced a \"Data Model Diagram\" feature that allows users to visualize the relationships between different objects within the CRM." - -#. js-lingui-id: vJncsm -#: src/platform/releases/release-notes.tsx -msgid "Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis." -msgstr "Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis." - -#. js-lingui-id: TR1ici -#: src/platform/releases/release-notes.tsx -msgid "Introduced a new design for notifications featuring lighter colors." -msgstr "Introduced a new design for notifications featuring lighter colors." - -#. js-lingui-id: 5G37wD -#: src/platform/releases/release-notes.tsx -msgid "Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today." -msgstr "Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today." - -#. js-lingui-id: 5BnBV4 -#: src/platform/releases/release-notes.tsx -msgid "Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!" -msgstr "Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!" - -#. js-lingui-id: KBwqIW -#: src/platform/releases/release-notes.tsx -msgid "Invite roles" -msgstr "Invite roles" - -#. js-lingui-id: FtgjCv -#: src/partner-application/data/partner-country-options.ts -msgid "Iran 🇮🇷" -msgstr "Iran 🇮🇷" - -#. js-lingui-id: 8yynyz -#: src/partner-application/data/partner-country-options.ts -msgid "Iraq 🇮🇶" -msgstr "Iraq 🇮🇶" - -#. js-lingui-id: s7XmoY -#: src/partner-application/data/partner-country-options.ts -msgid "Ireland 🇮🇪" -msgstr "Ireland 🇮🇪" - -#. js-lingui-id: /yQIKP -#: src/sections/faq/faq.data.ts -msgid "Is Twenty really open-source?" -msgstr "Is Twenty really open-source?" - -#. js-lingui-id: SdtpDP -#: src/partner-application/data/partner-country-options.ts -msgid "Israel 🇮🇱" -msgstr "Israel 🇮🇱" - -#. js-lingui-id: QjEULz -#: src/case-studies/case-study-catalog.ts -msgid "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other." -msgstr "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other." - -#. js-lingui-id: FJ51pP -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -msgid "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not." -msgstr "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not." - -#. js-lingui-id: kqIAbN -#: src/case-studies/case-study-stories.ts -msgid "It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck." -msgstr "It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck." - -#. js-lingui-id: ltNDOB -#: src/sections/problem/problem.data.ts -msgid "It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden." -msgstr "It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden." - -#. js-lingui-id: Lj7sBL -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Italian" -msgstr "Italian" - -#. js-lingui-id: OSTD8d -#: src/partner-application/data/partner-country-options.ts -msgid "Italy 🇮🇹" -msgstr "Italy 🇮🇹" - -#. js-lingui-id: 0BTIQi -#: src/partner-application/data/partner-country-options.ts -msgid "Ivory Coast 🇨🇮" -msgstr "Ivory Coast 🇨🇮" - -#. js-lingui-id: W6o2Pv -#: src/partner-application/data/partner-country-options.ts -msgid "Jamaica 🇯🇲" -msgstr "Jamaica 🇯🇲" - -#. js-lingui-id: kpk6mj -#: src/partner-application/data/partner-country-options.ts -msgid "Japan 🇯🇵" -msgstr "Japan 🇯🇵" - -#. js-lingui-id: dFtidv -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Japanese" -msgstr "Japanese" - -#. js-lingui-id: Lsf2+K -#: src/partner-application/partner-application-copy.ts -msgid "Join our ecosystem and help businesses take control of their customer data with open-source primitives." -msgstr "Join our ecosystem and help businesses take control of their customer data with open-source primitives." - -#. js-lingui-id: 1qiriB -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Join our growing partner ecosystem" -msgstr "Join our growing partner ecosystem" - -#. js-lingui-id: VQIurp -#: src/sections/partner-signoff/partner-signoff.tsx -msgid "Join our partner ecosystem and help businesses take control of their CRM." -msgstr "Join our partner ecosystem and help businesses take control of their CRM." - -#. js-lingui-id: m/pXki -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "Join the teams that chose to own their CRM. Start building with Twenty today." -msgstr "Join the teams that chose to own their CRM. Start building with Twenty today." - -#. js-lingui-id: QbxNys -#: src/partner-application/data/partner-country-options.ts -msgid "Jordan 🇯🇴" -msgstr "Jordan 🇯🇴" - -#. js-lingui-id: VnZMnC -#: src/platform/releases/release-notes.tsx -msgid "JSON Field" -msgstr "JSON Field" - -#. js-lingui-id: pB76mP -#: src/case-studies/case-study-catalog.ts -msgid "Jul 2025" -msgstr "Jul 2025" - -#. js-lingui-id: hvwlu3 -#: src/case-studies/case-study-catalog.ts -msgid "Jun 2025" -msgstr "Jun 2025" - -#. js-lingui-id: qrYDGE -#: src/sections/testimonials/testimonials.data.ts -msgid "Justin Beadle" -msgstr "Justin Beadle" - -#. js-lingui-id: vYXuJI -#: src/case-studies/case-study-stories.ts -msgid "Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions." -msgstr "Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions." - -#. js-lingui-id: E6Oohx -#: src/case-studies/case-study-stories.ts -msgid "Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it." -msgstr "Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it." - -#. js-lingui-id: 3LDjR0 -#: src/platform/releases/release-notes.tsx -msgid "Kanbans on any object" -msgstr "Kanbans on any object" - -#. js-lingui-id: r1cFAW -#: src/partner-application/data/partner-country-options.ts -msgid "Kazakhstan 🇰🇿" -msgstr "Kazakhstan 🇰🇿" - -#. js-lingui-id: kEahsE -#: src/partner-application/data/partner-country-options.ts -msgid "Kenya 🇰🇪" -msgstr "Kenya 🇰🇪" - -#. js-lingui-id: TLanjj -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "kept" -msgstr "kept" - -#. js-lingui-id: IxBSi8 -#: src/partner-application/data/partner-country-options.ts -msgid "Kiribati 🇰🇮" -msgstr "Kiribati 🇰🇮" - -#. js-lingui-id: h6S9Yz -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Korean" -msgstr "Korean" - -#. js-lingui-id: PqhUrP -#: src/partner-application/data/partner-country-options.ts -msgid "Kosovo 🇽🇰" -msgstr "Kosovo 🇽🇰" - -#. js-lingui-id: 3+TwF3 -#: src/partner-application/data/partner-country-options.ts -msgid "Kuwait 🇰🇼" -msgstr "Kuwait 🇰🇼" - -#. js-lingui-id: e9zZkH -#: src/partner-application/data/partner-country-options.ts -msgid "Kyrgyzstan 🇰🇬" -msgstr "Kyrgyzstan 🇰🇬" - -#. js-lingui-id: 8QgJZb -#: src/platform/releases/release-notes.tsx -msgid "Labs" -msgstr "Labs" - -#. js-lingui-id: GAmD3h -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/partners-marketplace/partner-facts-list.tsx -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Languages" -msgstr "Languages" - -#. js-lingui-id: u6jooT -#: src/partner-application/partner-application-copy.ts -msgid "Languages spoken" -msgstr "Languages spoken" - -#. js-lingui-id: YHacTY -#: src/partner-application/data/partner-country-options.ts -msgid "Laos 🇱🇦" -msgstr "Laos 🇱🇦" - -#. js-lingui-id: 2lrGbG -#: src/partners-marketplace/served-geo-labels.ts -msgid "LATAM" -msgstr "LATAM" - -#. js-lingui-id: WvrtRi -#: src/sections/releases-hero/releases-hero.tsx -msgid "" -"Latest\n" -"*Releases*" -msgstr "" -"Latest\n" -"*Releases*" - -#. js-lingui-id: 7OHfcc -#: src/partner-application/data/partner-country-options.ts -msgid "Latvia 🇱🇻" -msgstr "Latvia 🇱🇻" - -#. js-lingui-id: rdU729 -#: src/sections/stepper/product-stepper-data.ts -msgid "Layout" -msgstr "Layout" - -#. js-lingui-id: +Ss/og -#: src/sections/menu/menu.data.ts -msgid "Learn how to use Twenty" -msgstr "Learn how to use Twenty" - -#. js-lingui-id: wB0DGn -#: src/partner-application/data/partner-country-options.ts -msgid "Lebanon 🇱🇧" -msgstr "Lebanon 🇱🇧" - -#. js-lingui-id: vifyyw -#: src/sections/footer/footer.data.ts -msgid "Legal" -msgstr "Legal" - -#. js-lingui-id: UqdHpG -#: src/partner-application/data/partner-country-options.ts -msgid "Lesotho 🇱🇸" -msgstr "Lesotho 🇱🇸" - -#. js-lingui-id: rJargy -#: src/partner-application/data/partner-country-options.ts -msgid "Liberia 🇱🇷" -msgstr "Liberia 🇱🇷" - -#. js-lingui-id: Lzw0kM -#: src/partner-application/data/partner-country-options.ts -msgid "Libya 🇱🇾" -msgstr "Libya 🇱🇾" - -#. js-lingui-id: tHFTlp -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Licensee:" -msgstr "Licensee:" - -#. js-lingui-id: K41WYc -#: src/partner-application/data/partner-country-options.ts -msgid "Liechtenstein 🇱🇮" -msgstr "Liechtenstein 🇱🇮" - -#. js-lingui-id: ESTOTK -#: src/platform/releases/release-notes.tsx -msgid "Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content." -msgstr "Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content." - -#. js-lingui-id: kvxPie -#: src/platform/releases/release-notes.tsx -msgid "Link field" -msgstr "Link field" - -#. js-lingui-id: gggTBm -#: src/sections/footer/footer.data.ts -msgid "LinkedIn" -msgstr "LinkedIn" - -#. js-lingui-id: 3hSKC5 -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "LinkedIn (opens in new tab)" -msgstr "LinkedIn (opens in new tab)" - -#. js-lingui-id: Gg69LR -#: src/partner-application/partner-application-copy.ts -msgid "LinkedIn URL" -msgstr "LinkedIn URL" - -#. js-lingui-id: 2WIZYd -#: src/partner-application/data/partner-country-options.ts -msgid "Lithuania 🇱🇹" -msgstr "Lithuania 🇱🇹" - -#. js-lingui-id: AHVzME -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Live data and AI built" -msgstr "Live data and AI built" - -#. js-lingui-id: GObQuL -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Live updates" -msgstr "Live updates" - -#. js-lingui-id: zmRZwk -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Live updates are unavailable, which is almost more honest." -msgstr "Live updates are unavailable, which is almost more honest." - -#. js-lingui-id: ObPscj -#: src/sections/enterprise-activate/enterprise-activate-panel.tsx -msgid "Loading activation…" -msgstr "Loading activation…" - -#. js-lingui-id: Oyf4mg -#: src/contact-cal/contact-cal-modal.tsx -msgid "Loading form…" -msgstr "Loading form…" - -#. js-lingui-id: Pwqkdw -#: src/partner-application/partner-application-modal.tsx -msgid "Loading…" -msgstr "Loading…" - -#. js-lingui-id: 7VBQ2j -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Local, Production" -msgstr "Local, Production" - -#. js-lingui-id: JO8Bdx -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Lock-in" -msgstr "Lock-in" - -#. js-lingui-id: sQia9P -#: src/sections/menu/menu.tsx -#: src/sections/menu/menu-drawer.tsx -msgid "Log in" -msgstr "Log in" - -#. js-lingui-id: KPLAuI -#: src/case-studies/case-study-catalog.ts -msgid "Lower CRM cost" -msgstr "Lower CRM cost" - -#. js-lingui-id: J13skq -#: src/partner-application/data/partner-country-options.ts -msgid "Luxembourg 🇱🇺" -msgstr "Luxembourg 🇱🇺" - -#. js-lingui-id: nRYQC8 -#: src/partner-application/data/partner-country-options.ts -msgid "Madagascar 🇲🇬" -msgstr "Madagascar 🇲🇬" - -#. js-lingui-id: /hmUGb -#: src/platform/releases/release-notes.tsx -msgid "Maintenance mode" -msgstr "Maintenance mode" - -#. js-lingui-id: BNd15Z -#: src/sections/feature-cards/feature-cards.tsx -msgid "Make your GTM team happy with *a CRM they'll love*" -msgstr "Make your GTM team happy with *a CRM they'll love*" - -#. js-lingui-id: qHvKxh -#: src/partner-application/data/partner-country-options.ts -msgid "Malawi 🇲🇼" -msgstr "Malawi 🇲🇼" - -#. js-lingui-id: tF97tn -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Malay" -msgstr "Malay" - -#. js-lingui-id: DIOh5g -#: src/partner-application/data/partner-country-options.ts -msgid "Malaysia 🇲🇾" -msgstr "Malaysia 🇲🇾" - -#. js-lingui-id: 62/ScF -#: src/partner-application/data/partner-country-options.ts -msgid "Maldives 🇲🇻" -msgstr "Maldives 🇲🇻" - -#. js-lingui-id: wc5E/3 -#: src/partner-application/data/partner-country-options.ts -msgid "Mali 🇲🇱" -msgstr "Mali 🇲🇱" - -#. js-lingui-id: 04fjhR -#: src/partner-application/data/partner-country-options.ts -msgid "Malta 🇲🇹" -msgstr "Malta 🇲🇹" - -#. js-lingui-id: Si4WyF -#: src/case-studies/case-study-catalog.ts -msgid "Management Consulting" -msgstr "Management Consulting" - -#. js-lingui-id: TMZPkv -#: src/platform/releases/release-notes.tsx -msgid "Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run." -msgstr "Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run." - -#. js-lingui-id: poX06f -#: src/case-studies/case-study-catalog.ts -msgid "Manual work at core" -msgstr "Manual work at core" - -#. js-lingui-id: VJOKPB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Maps view" -msgstr "Maps view" - -#. js-lingui-id: Zt5PUS -#: src/partners-marketplace/marketplace-header.tsx -msgid "Marketplace" -msgstr "Marketplace" - -#. js-lingui-id: 2jVbnO -#: src/partner-application/data/partner-country-options.ts -msgid "Marshall Islands 🇲🇭" -msgstr "Marshall Islands 🇲🇭" - -#. js-lingui-id: bJNKJ1 -#: src/sections/menu/menu.data.ts -msgid "Master every corner of Twenty" -msgstr "Master every corner of Twenty" - -#. js-lingui-id: HG/EUg -#: src/partner-application/data/partner-country-options.ts -msgid "Mauritania 🇲🇷" -msgstr "Mauritania 🇲🇷" - -#. js-lingui-id: YDiaY/ -#: src/partner-application/data/partner-country-options.ts -msgid "Mauritius 🇲🇺" -msgstr "Mauritius 🇲🇺" - -#. js-lingui-id: Zw+Zv+ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "MCP server" -msgstr "MCP server" - -#. js-lingui-id: bwCiCi -#: src/sections/menu/menu.data.ts -msgid "Meet the certified agencies and consultants implementing Twenty for teams worldwide." -msgstr "Meet the certified agencies and consultants implementing Twenty for teams worldwide." - -#. js-lingui-id: ujYZ+f -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks." -msgstr "Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks." - -#. js-lingui-id: CQ9M36 -#: src/partners-marketplace/served-geo-labels.ts -msgid "MENA" -msgstr "MENA" - -#. js-lingui-id: +9RIKB -#: src/platform/releases/release-notes.tsx -msgid "Merge Records" -msgstr "Merge Records" - -#. js-lingui-id: briyJf -#: src/sections/product-feature/feature-tiles.ts -msgid "Metrics you can actually trust." -msgstr "Metrics you can actually trust." - -#. js-lingui-id: YBLFQZ -#: src/partner-application/data/partner-country-options.ts -msgid "Mexico 🇲🇽" -msgstr "Mexico 🇲🇽" - -#. js-lingui-id: KBirDR -#: src/partner-application/data/partner-country-options.ts -msgid "Micronesia 🇫🇲" -msgstr "Micronesia 🇫🇲" - -#. js-lingui-id: YeVpda -#: src/platform/releases/release-notes.tsx -msgid "Microsoft o365 Integration" -msgstr "Microsoft o365 Integration" - -#. js-lingui-id: so04x6 -#: src/case-studies/case-study-stories.ts -msgid "Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it." -msgstr "Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it." - -#. js-lingui-id: izddzp -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Mike Babiy" -msgstr "Mike Babiy" - -#. js-lingui-id: 3TSz9S -#: src/app-preview/stage/traffic-lights.tsx -msgid "Minimize" -msgstr "Minimize" - -#. js-lingui-id: FFFENV -#: src/partner-application/partner-application-copy.ts -msgid "Minimum project budget" -msgstr "Minimum project budget" - -#. js-lingui-id: 179i38 -#: src/platform/releases/release-notes.tsx -msgid "Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place." -msgstr "Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place." - -#. js-lingui-id: 6m8rMT -#: src/partner-application/data/partner-country-options.ts -msgid "Moldova 🇲🇩" -msgstr "Moldova 🇲🇩" - -#. js-lingui-id: qRRmSe -#: src/partner-application/data/partner-country-options.ts -msgid "Monaco 🇲🇨" -msgstr "Monaco 🇲🇨" - -#. js-lingui-id: G+EV+A -#: src/partner-application/data/partner-country-options.ts -msgid "Mongolia 🇲🇳" -msgstr "Mongolia 🇲🇳" - -#. js-lingui-id: 9VDoNp -#: src/partner-application/data/partner-country-options.ts -msgid "Montenegro 🇲🇪" -msgstr "Montenegro 🇲🇪" - -#. js-lingui-id: +8Nek/ -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Monthly" -msgstr "Monthly" - -#. js-lingui-id: paxFAm -#: src/platform/releases/release-notes.tsx -msgid "More field relations" -msgstr "More field relations" - -#. js-lingui-id: kHdAOE -#: src/platform/releases/release-notes.tsx -msgid "More Field Types, More Power" -msgstr "More Field Types, More Power" - -#. js-lingui-id: VqXuUv -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "More options available!" -msgstr "More options available!" - -#. js-lingui-id: AZrhlt -#: src/platform/releases/release-notes.tsx -msgid "More powerful search" -msgstr "More powerful search" - -#. js-lingui-id: LAFO4Y -#: src/partner-application/data/partner-country-options.ts -msgid "Morocco 🇲🇦" -msgstr "Morocco 🇲🇦" - -#. js-lingui-id: E4h9+U -#: src/platform/releases/release-notes.tsx -msgid "Morph Many Relationships" -msgstr "Morph Many Relationships" - -#. js-lingui-id: EwJDrS -#: src/partner-application/data/partner-country-options.ts -msgid "Mozambique 🇲🇿" -msgstr "Mozambique 🇲🇿" - -#. js-lingui-id: dlKkNL -#: src/sections/product-feature/feature-tiles.ts -msgid "Multi-file upload on records" -msgstr "Multi-file upload on records" - -#. js-lingui-id: 4nwdYp -#: src/platform/releases/release-notes.tsx -msgid "Multi-Record Workflow Triggers" -msgstr "Multi-Record Workflow Triggers" - -#. js-lingui-id: S5w2Q/ -#: src/platform/releases/release-notes.tsx -msgid "Multi-Select Field" -msgstr "Multi-Select Field" - -#. js-lingui-id: Gorywi -#: src/platform/releases/release-notes.tsx -msgid "Multi-Workspace" -msgstr "Multi-Workspace" - -#. js-lingui-id: QGWbbv -#: src/partner-application/data/partner-country-options.ts -msgid "Myanmar 🇲🇲" -msgstr "Myanmar 🇲🇲" - -#. js-lingui-id: 6YtxFj -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Name" -msgstr "Name" - -#. js-lingui-id: yYmxee -#: src/partner-application/data/partner-country-options.ts -msgid "Namibia 🇳🇦" -msgstr "Namibia 🇳🇦" - -#. js-lingui-id: zVOV14 -#: src/partner-application/data/partner-country-options.ts -msgid "Nauru 🇳🇷" -msgstr "Nauru 🇳🇷" - -#. js-lingui-id: Akl9+2 -#: src/platform/releases/release-notes.tsx -msgid "Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \"Close\" button." -msgstr "Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \"Close\" button." - -#. js-lingui-id: TizFpt -#: src/sections/menu/menu-drawer.tsx -msgid "Navigation menu" -msgstr "Navigation menu" - -#. js-lingui-id: LfNsfa -#: src/sections/stepper/product-stepper-content.tsx -msgid "Need a quick change? Skip the engineering ticket. Customize your workspace in minutes." -msgstr "Need a quick change? Skip the engineering ticket. Customize your workspace in minutes." - -#. js-lingui-id: 4sbgPq -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -msgid "Need help with customization?" -msgstr "Need help with customization?" - -#. js-lingui-id: LNVNNE -#: src/partner-application/data/partner-country-options.ts -msgid "Nepal 🇳🇵" -msgstr "Nepal 🇳🇵" - -#. js-lingui-id: g60EgR -#: src/partner-application/data/partner-country-options.ts -msgid "Netherlands 🇳🇱" -msgstr "Netherlands 🇳🇱" - -#. js-lingui-id: 8Cp4Of -#: src/case-studies/case-study-stories.ts -msgid "NetZero" -msgstr "NetZero" - -#. js-lingui-id: J8ZssL -#: src/sections/helped/helped.data.ts -msgid "NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems." -msgstr "NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems." - -#. js-lingui-id: 7HVBV+ -#: src/case-studies/case-study-catalog.ts -msgid "NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows." -msgstr "NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows." - -#. js-lingui-id: 3PtYTO -#: src/case-studies/case-study-stories.ts -msgid "NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation." -msgstr "NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation." - -#. js-lingui-id: zgjuZq -#: src/platform/releases/release-notes.tsx -msgid "New Array field type" -msgstr "New Array field type" - -#. js-lingui-id: cU1+gU -#: src/platform/releases/release-notes.tsx -msgid "New record page" -msgstr "New record page" - -#. js-lingui-id: pAKqTG -#: src/platform/releases/release-notes.tsx -msgid "New Settings layout" -msgstr "New Settings layout" - -#. js-lingui-id: a54odP -#: src/platform/releases/release-notes.tsx -msgid "New Side Panel" -msgstr "New Side Panel" - -#. js-lingui-id: /DTtCF -#: src/partner-application/data/partner-country-options.ts -msgid "New Zealand 🇳🇿" -msgstr "New Zealand 🇳🇿" - -#. js-lingui-id: GY6uSc -#: src/partner-application/partner-application-copy.ts -msgid "Next →" -msgstr "Next →" - -#. js-lingui-id: KqojOL -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Next steps" -msgstr "Next steps" - -#. js-lingui-id: awYrJD -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Next testimonial" -msgstr "Next testimonial" - -#. js-lingui-id: iBOZv7 -#: src/partner-application/data/partner-country-options.ts -msgid "Nicaragua 🇳🇮" -msgstr "Nicaragua 🇳🇮" - -#. js-lingui-id: 61NU7V -#: src/partner-application/data/partner-country-options.ts -msgid "Niger 🇳🇪" -msgstr "Niger 🇳🇪" - -#. js-lingui-id: +2NLII -#: src/partner-application/data/partner-country-options.ts -msgid "Nigeria 🇳🇬" -msgstr "Nigeria 🇳🇬" - -#. js-lingui-id: qZ+egR -#: src/case-studies/case-study-catalog.ts -msgid "Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations." -msgstr "Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations." - -#. js-lingui-id: sGuHDu -#: src/case-studies/case-study-stories.ts -msgid "Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day." -msgstr "Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day." - -#. js-lingui-id: G0GGKA -#: src/case-studies/case-study-stories.ts -msgid "Nine Dots Ventures" -msgstr "Nine Dots Ventures" - -#. js-lingui-id: 1UzENP -#: src/sections/pricing-plan-table/plan-table-content.tsx -msgid "No" -msgstr "No" - -#. js-lingui-id: 6tRXQ4 -#: src/partner-application/partner-application-copy.ts -msgid "No matching country." -msgstr "No matching country." - -#. js-lingui-id: 1hNHaC -#: src/case-studies/case-study-stories.ts -msgid "No more renting someone else's *structure*" -msgstr "No more renting someone else's *structure*" - -#. js-lingui-id: LmWdm6 -#: src/case-studies/case-study-stories.ts -msgid "No more renting someone else's structure" -msgstr "No more renting someone else's structure" - -#. js-lingui-id: UxK4so -#: src/partners-marketplace/empty-state.tsx -msgid "No partners match your filters" -msgstr "No partners match your filters" - -#. js-lingui-id: nDjC8E -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "No session ID provided. Please complete the checkout first." -msgstr "No session ID provided. Please complete the checkout first." - -#. js-lingui-id: q9f4Tp -#: src/case-studies/case-study-catalog.ts -msgid "No-code" -msgstr "No-code" - -#. js-lingui-id: SiZ/7E -#: src/sections/faq/faq.data.ts -msgid "No. Build custom objects, fields, views, and no-code workflows straight from Settings. Unlimited, no extra charge." -msgstr "No. Build custom objects, fields, views, and no-code workflows straight from Settings. Unlimited, no extra charge." - -#. js-lingui-id: 096JXI -#: src/partner-application/data/partner-country-options.ts -msgid "North Korea 🇰🇵" -msgstr "North Korea 🇰🇵" - -#. js-lingui-id: IwF7aJ -#: src/partner-application/data/partner-country-options.ts -msgid "North Macedonia 🇲🇰" -msgstr "North Macedonia 🇲🇰" - -#. js-lingui-id: sZwk4U -#: src/partner-application/data/partner-country-options.ts -msgid "Norway 🇳🇴" -msgstr "Norway 🇳🇴" - -#. js-lingui-id: 1IipHp -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Norwegian" -msgstr "Norwegian" - -#. js-lingui-id: YfzRVa -#: src/platform/releases/release-notes.tsx -msgid "Notes and Tasks standard objects" -msgstr "Notes and Tasks standard objects" - -#. js-lingui-id: iDNBZe -#: src/platform/releases/release-notes.tsx -msgid "Notifications" -msgstr "Notifications" - -#. js-lingui-id: k3T2mM -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you." -msgstr "Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you." - -#. js-lingui-id: CzeIij -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Number of dashboards" -msgstr "Number of dashboards" - -#. js-lingui-id: pkrZnO -#: src/case-studies/case-study-stories.ts -msgid "Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first." -msgstr "Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first." - -#. js-lingui-id: l/1LQc -#: src/sections/testimonials/testimonials.data.ts -msgid "Olivier Reinaud" -msgstr "Olivier Reinaud" - -#. js-lingui-id: BdShAR -#: src/partner-application/data/partner-country-options.ts -msgid "Oman 🇴🇲" -msgstr "Oman 🇴🇲" - -#. js-lingui-id: D2b+1q -#: src/case-studies/case-study-catalog.ts -msgid "On a single CRM" -msgstr "On a single CRM" - -#. js-lingui-id: w5ATz2 -#: src/platform/releases/release-notes.tsx -msgid "On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones." -msgstr "On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones." - -#. js-lingui-id: XhXmzW -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "On this page" -msgstr "On this page" - -#. js-lingui-id: jxC7HY -#: src/partner-application/data/partner-scope-options.ts -msgid "Onboarding · Documentation · Change management · L1/L2 support · Managed services" -msgstr "Onboarding · Documentation · Change management · L1/L2 support · Managed services" - -#. js-lingui-id: pbmZ7R -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Onboarding Packs" -msgstr "Onboarding Packs" - -#. js-lingui-id: 37OSdM -#: src/case-studies/case-study-stories.ts -msgid "One *API* to rule them all" -msgstr "One *API* to rule them all" - -#. js-lingui-id: Zt1UZb -#: src/case-studies/case-study-stories.ts -msgid "One API to rule them all" -msgstr "One API to rule them all" - -#. js-lingui-id: pShqss -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Only $5 for SSO. Practically a charity program." -msgstr "Only $5 for SSO. Practically a charity program." - -#. js-lingui-id: GSr0rF -#: src/sections/menu/menu.tsx -msgid "Open menu" -msgstr "Open menu" - -#. js-lingui-id: pkXQA+ -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Open your Twenty self-hosted instance Settings → Enterprise." -msgstr "Open your Twenty self-hosted instance Settings → Enterprise." - -#. js-lingui-id: 5RkmVr -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -msgid "Open-source, AI-ready, and yours to shape." -msgstr "Open-source, AI-ready, and yours to shape." - -#. js-lingui-id: ucgZ0o -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Organization" -msgstr "Organization" - -#. js-lingui-id: nDTfhz -#: src/platform/releases/release-notes.tsx -msgid "Other improvements" -msgstr "Other improvements" - -#. js-lingui-id: 3PlK59 -#: src/platform/releases/release-notes.tsx -msgid "Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden." -msgstr "Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden." - -#. js-lingui-id: dKGg8T -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Out of stock" -msgstr "Out of stock" - -#. js-lingui-id: PASC/7 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Outlived every redesign since 2004." -msgstr "Outlived every redesign since 2004." - -#. js-lingui-id: Bwsi7B -#: src/sections/helped/helped.data.ts -msgid "Own your CRM end to end" -msgstr "Own your CRM end to end" - -#. js-lingui-id: oDAEQq -#: src/case-studies/case-study-stories.ts -msgid "Ownership" -msgstr "Ownership" - -#. js-lingui-id: NmF/Vo -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Owning your stack remains mysteriously out of stock." -msgstr "Owning your stack remains mysteriously out of stock." - -#. js-lingui-id: h/oMMb -#: src/platform/routing/static-website-routes.ts -msgid "Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform." -msgstr "Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform." - -#. js-lingui-id: +AiiMt -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Pagination builds character." -msgstr "Pagination builds character." - -#. js-lingui-id: sW3DaS -#: src/partner-application/data/partner-country-options.ts -msgid "Pakistan 🇵🇰" -msgstr "Pakistan 🇵🇰" - -#. js-lingui-id: cvRU36 -#: src/partner-application/data/partner-country-options.ts -msgid "Palau 🇵🇼" -msgstr "Palau 🇵🇼" - -#. js-lingui-id: u2htNd -#: src/partner-application/data/partner-country-options.ts -msgid "Palestine 🇵🇸" -msgstr "Palestine 🇵🇸" - -#. js-lingui-id: pWLp16 -#: src/partner-application/data/partner-country-options.ts -msgid "Panama 🇵🇦" -msgstr "Panama 🇵🇦" - -#. js-lingui-id: xOR4tu -#: src/partner-application/data/partner-country-options.ts -msgid "Papua New Guinea 🇵🇬" -msgstr "Papua New Guinea 🇵🇬" - -#. js-lingui-id: kb3PhK -#: src/partner-application/data/partner-country-options.ts -msgid "Paraguay 🇵🇾" -msgstr "Paraguay 🇵🇾" - -#. js-lingui-id: cLitIC -#: src/partner-application/partner-application-modal.tsx -msgid "Partner application" -msgstr "Partner application" - -#. js-lingui-id: mYGIvm -#: src/partners-marketplace/partner-profile.tsx -msgid "Partner facts and contact" -msgstr "Partner facts and contact" - -#. js-lingui-id: 4RPECg -#: src/app/[locale]/(site)/partners/profile/[slug]/page.tsx -msgid "Partner not found — Twenty Partners" -msgstr "Partner not found — Twenty Partners" - -#. js-lingui-id: dRIK0d -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Partner testimonials" -msgstr "Partner testimonials" - -#. js-lingui-id: mPkInZ -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Partners" -msgstr "Partners" - -#. js-lingui-id: 9yo8NN -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Paste the key and click Activate." -msgstr "Paste the key and click Activate." - -#. js-lingui-id: TMErUt -#: src/platform/releases/release-notes.tsx -msgid "Percentage in number fields" -msgstr "Percentage in number fields" - -#. js-lingui-id: v1i9+n -#: src/platform/releases/release-notes.tsx -msgid "Performance Improvements" -msgstr "Performance Improvements" - -#. js-lingui-id: JjOHl8 -#: src/platform/releases/release-notes.tsx -msgid "Permissions V1" -msgstr "Permissions V1" - -#. js-lingui-id: kJQ+gL -#: src/platform/releases/release-notes.tsx -msgid "Permissions V2" -msgstr "Permissions V2" - -#. js-lingui-id: OzAIDr -#: src/partner-application/data/partner-country-options.ts -msgid "Peru 🇵🇪" -msgstr "Peru 🇵🇪" - -#. js-lingui-id: LqRs8D -#: src/partner-application/data/partner-country-options.ts -msgid "Philippines 🇵🇭" -msgstr "Philippines 🇵🇭" - -#. js-lingui-id: we6gj5 -#: src/partner-application/partner-application-copy.ts -msgid "Pick every category that applies." -msgstr "Pick every category that applies." - -#. js-lingui-id: KEEuJt -#: src/platform/releases/release-notes.tsx -msgid "Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client." -msgstr "Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client." - -#. js-lingui-id: FFkjaT -#: src/sections/product-feature/feature-tiles.ts -msgid "Pipeline Management" -msgstr "Pipeline Management" - -#. js-lingui-id: gzkkC3 -#: src/platform/routing/static-website-routes.ts -msgid "Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use." -msgstr "Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use." - -#. js-lingui-id: z7gnI9 -#: src/partner-application/partner-application-copy.ts -msgid "Please complete all required fields before continuing." -msgstr "Please complete all required fields before continuing." - -#. js-lingui-id: AFr2a5 -#: src/partner-application/data/partner-country-options.ts -msgid "Poland 🇵🇱" -msgstr "Poland 🇵🇱" - -#. js-lingui-id: trnWaw -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Polish" -msgstr "Polish" - -#. js-lingui-id: /LAeug -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Portrait of {authorName}" -msgstr "Portrait of {authorName}" - -#. js-lingui-id: 8BrmUs -#: src/partner-application/data/partner-country-options.ts -msgid "Portugal 🇵🇹" -msgstr "Portugal 🇵🇹" - -#. js-lingui-id: MOERNx -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Portuguese" -msgstr "Portuguese" - -#. js-lingui-id: z87IFG -#: src/partner-application/partner-application-copy.ts -msgid "Press Enter or comma to add a skill." -msgstr "Press Enter or comma to add a skill." - -#. js-lingui-id: LZoO8F -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Previous testimonial" -msgstr "Previous testimonial" - -#. js-lingui-id: a7u1N9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Price" -msgstr "Price" - -#. js-lingui-id: aHCEmh -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/partners-marketplace/partner-money-row.tsx -msgid "Pricing" -msgstr "Pricing" - -#. js-lingui-id: T/R+Qz -#: src/sections/menu/menu-nav.tsx -#: src/sections/menu/menu-drawer.tsx -msgid "Primary" -msgstr "Primary" - -#. js-lingui-id: J2IAmT -#: src/sections/three-cards/three-cards.data.ts -msgid "Principal and Founder" -msgstr "Principal and Founder" - -#. js-lingui-id: kXBQYM -#: src/sections/testimonials/partner-testimonials.data.ts -#: src/case-studies/case-study-catalog.ts -msgid "Principal and Founder, Alternative Partners" -msgstr "Principal and Founder, Alternative Partners" - -#. js-lingui-id: k62X/2 -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Priority support" -msgstr "Priority support" - -#. js-lingui-id: LcET2C -#: src/sections/footer/footer.data.ts -#: src/app/[locale]/(site)/privacy-policy/page.tsx -msgid "Privacy Policy" -msgstr "Privacy Policy" - -#. js-lingui-id: DJ3uVe -#: src/platform/routing/static-website-routes.ts -msgid "Privacy Policy | Twenty" -msgstr "Privacy Policy | Twenty" - -#. js-lingui-id: 3fPjUY -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Pro" -msgstr "Pro" - -#. js-lingui-id: K47k8R -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Product" -msgstr "Product" - -#. js-lingui-id: kIGKva -#: src/sections/three-cards/three-cards.data.ts -msgid "Production grade quality" -msgstr "Production grade quality" - -#. js-lingui-id: vERlcd -#: src/partner-application/partner-application-copy.ts -msgid "Profile" -msgstr "Profile" - -#. js-lingui-id: CcK9cq -#: src/case-studies/case-study-stories.ts -msgid "Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around." -msgstr "Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around." - -#. js-lingui-id: PaHxQd -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Project minimum" -msgstr "Project minimum" - -#. js-lingui-id: 9NAqO4 -#: src/case-studies/case-study-catalog.ts -msgid "Proposal automation" -msgstr "Proposal automation" - -#. js-lingui-id: a24q7E -#: src/sections/problem/problem.data.ts -msgid "Proprietary languages, slow deployment cycles, and \"black box\" logic." -msgstr "Proprietary languages, slow deployment cycles, and \"black box\" logic." - -#. js-lingui-id: u9RZ7+ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Punjabi" -msgstr "Punjabi" - -#. js-lingui-id: frfCYp -#: src/case-studies/case-study-catalog.ts -msgid "Q1 2026" -msgstr "Q1 2026" - -#. js-lingui-id: tFx+ES -#: src/partner-application/data/partner-country-options.ts -msgid "Qatar 🇶🇦" -msgstr "Qatar 🇶🇦" - -#. js-lingui-id: OialmJ -#: src/platform/releases/release-notes.tsx -msgid "Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input." -msgstr "Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input." - -#. js-lingui-id: 3XOwjg -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Rates" -msgstr "Rates" - -#. js-lingui-id: zXRspj -#: src/platform/releases/release-notes.tsx -msgid "Rating field" -msgstr "Rating field" - -#. js-lingui-id: DnWJal -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Reach out" -msgstr "Reach out" - -#. js-lingui-id: gSQVmr -#: src/sections/helped/helped-card.tsx -msgid "Read the case" -msgstr "Read the case" - -#. js-lingui-id: EqCbT9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Read/Edit/Delete permissions" -msgstr "Read/Edit/Delete permissions" - -#. js-lingui-id: /6qiAz -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -msgid "" -"Ready to build\n" -"*your own story?*" -msgstr "" -"Ready to build\n" -"*your own story?*" - -#. js-lingui-id: TqQ08B -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "" -"Ready to grow\n" -"*with Twenty?*" -msgstr "" -"Ready to grow\n" -"*with Twenty?*" - -#. js-lingui-id: zTY2by -#: src/platform/routing/static-website-routes.ts -msgid "Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit." -msgstr "Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit." - -#. js-lingui-id: NIwjHh -#: src/case-studies/case-study-catalog.ts -msgid "Real Estate" -msgstr "Real Estate" - -#. js-lingui-id: CH+Ona -#: src/sections/customers-hero/customers-hero.tsx -msgid "Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth." -msgstr "Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth." - -#. js-lingui-id: 5O1eTm -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Real-time changes? That will be a premium surprise." -msgstr "Real-time changes? That will be a premium surprise." - -#. js-lingui-id: 4hc7hc -#: src/sections/three-cards/product-three-cards-data.ts -#: src/sections/product-feature/feature-tiles.ts -msgid "Real-time data" -msgstr "Real-time data" - -#. js-lingui-id: dKQCrj -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Real-time is a state of mind, not a feature." -msgstr "Real-time is a state of mind, not a feature." - -#. js-lingui-id: P7gVBH -#: src/platform/releases/release-notes.tsx -msgid "Record is created or updated trigger" -msgstr "Record is created or updated trigger" - -#. js-lingui-id: Zhiuz9 -#: src/case-studies/case-study-catalog.ts -msgid "Record quarter" -msgstr "Record quarter" - -#. js-lingui-id: PWlTvh -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Records" -msgstr "Records" - -#. js-lingui-id: q45OlW -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Regions" -msgstr "Regions" - -#. js-lingui-id: GtQZI0 -#: src/platform/releases/release-notes.tsx -msgid "Relation Fields on Record Page" -msgstr "Relation Fields on Record Page" - -#. js-lingui-id: plY6Rp -#: src/platform/releases/release-notes.tsx -msgid "Relations on Record Pages" -msgstr "Relations on Record Pages" - -#. js-lingui-id: rwWjWg -#: src/sections/footer/footer.data.ts -msgid "Release Notes" -msgstr "Release Notes" - -#. js-lingui-id: 5icoS1 -#: src/sections/releases-feed/releases-feed.tsx -#: src/sections/menu/menu.data.ts -msgid "Releases" -msgstr "Releases" - -#. js-lingui-id: BkBq/5 -#. placeholder {0}: pill.text -#: src/partners-marketplace/active-filter-pills.tsx -msgid "Remove {0} filter" -msgstr "Remove {0} filter" - -#. js-lingui-id: OY7BZk -#: src/partner-application/partner-application-copy.ts -msgid "Remove {skill}" -msgstr "Remove {skill}" - -#. js-lingui-id: a/aGHe -#: src/sections/product-feature/feature-tiles.ts -msgid "Rename, download, and delete attachments" -msgstr "Rename, download, and delete attachments" - -#. js-lingui-id: t9yxlZ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Reports" -msgstr "Reports" - -#. js-lingui-id: SY/an2 -#: src/sections/product-feature/feature-tiles.ts -msgid "Reports & Dashboards" -msgstr "Reports & Dashboards" - -#. js-lingui-id: TD9BOQ -#: src/app-preview/terminal/terminal-send-button.tsx -msgid "Reset conversation" -msgstr "Reset conversation" - -#. js-lingui-id: ZYyPd8 -#: src/platform/releases/release-notes.tsx -msgid "Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts." -msgstr "Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts." - -#. js-lingui-id: tpLAlL -#: src/platform/releases/release-notes.tsx -msgid "Resize navbar and side panel" -msgstr "Resize navbar and side panel" - -#. js-lingui-id: s+MGs7 -#: src/sections/menu/menu.data.ts -msgid "Resources" -msgstr "Resources" - -#. js-lingui-id: oC2l7f -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "REST & GraphQL API" -msgstr "REST & GraphQL API" - -#. js-lingui-id: kx0s+n -#: src/case-studies/case-study-stories.ts -msgid "Results" -msgstr "Results" - -#. js-lingui-id: 2itg0p -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Retro 2015" -msgstr "Retro 2015" - -#. js-lingui-id: H0dEn+ -#: src/app-preview/stage/flying-traffic-lights.tsx -msgid "Return traffic light" -msgstr "Return traffic light" - -#. js-lingui-id: k2x4+M -#: src/platform/releases/release-notes.tsx -msgid "Revamp View Options Menu" -msgstr "Revamp View Options Menu" - -#. js-lingui-id: 7xiRJz -#: src/platform/releases/release-notes.tsx -msgid "Revamped Navigation Bar" -msgstr "Revamped Navigation Bar" - -#. js-lingui-id: lHXjXQ -#: src/platform/releases/release-notes.tsx -msgid "Revamped Side Panel" -msgstr "Revamped Side Panel" - -#. js-lingui-id: frqduN -#: src/sections/product-feature/feature-tiles.ts -msgid "Rich notes attached to records" -msgstr "Rich notes attached to records" - -#. js-lingui-id: i4ofLR -#: src/platform/releases/release-notes.tsx -msgid "Rich text layouts" -msgstr "Rich text layouts" - -#. js-lingui-id: /gaSVU -#: src/case-studies/case-study-stories.ts -msgid "Roadmap" -msgstr "Roadmap" - -#. js-lingui-id: mLp5AP -#: src/partner-application/data/partner-country-options.ts -msgid "Romania 🇷🇴" -msgstr "Romania 🇷🇴" - -#. js-lingui-id: uJc01W -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Romanian" -msgstr "Romanian" - -#. js-lingui-id: Wdh41P -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Row-level permissions" -msgstr "Row-level permissions" - -#. js-lingui-id: mRpuWW -#: src/case-studies/case-study-stories.ts -msgid "Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks." -msgstr "Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks." - -#. js-lingui-id: T1ut28 -#: src/partner-application/data/partner-country-options.ts -msgid "Russia 🇷🇺" -msgstr "Russia 🇷🇺" - -#. js-lingui-id: nji0/X -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Russian" -msgstr "Russian" - -#. js-lingui-id: dw8D3T -#: src/partner-application/data/partner-country-options.ts -msgid "Rwanda 🇷🇼" -msgstr "Rwanda 🇷🇼" - -#. js-lingui-id: niLOap -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Kitts & Nevis 🇰🇳" -msgstr "Saint Kitts & Nevis 🇰🇳" - -#. js-lingui-id: zCHzF/ -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Lucia 🇱🇨" -msgstr "Saint Lucia 🇱🇨" - -#. js-lingui-id: Md/8iQ -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Vincent 🇻🇨" -msgstr "Saint Vincent 🇻🇨" - -#. js-lingui-id: Burn4/ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesfarce Add-on Center" -msgstr "Salesfarce Add-on Center" - -#. js-lingui-id: xTfEgV -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesfarce Pro" -msgstr "Salesfarce Pro" - -#. js-lingui-id: /UolBB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesforce Classic" -msgstr "Salesforce Classic" - -#. js-lingui-id: l69E+u -#: src/case-studies/case-study-catalog.ts -msgid "Salesforce migration" -msgstr "Salesforce migration" - -#. js-lingui-id: CADlRK -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same CRM" -msgstr "Same CRM" - -#. js-lingui-id: 60i6S+ -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same output" -msgstr "Same output" - -#. js-lingui-id: xl2tJ9 -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same results" -msgstr "Same results" - -#. js-lingui-id: w9QWxz -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "SAML/OIDC SSO" -msgstr "SAML/OIDC SSO" - -#. js-lingui-id: R38ZPo -#: src/partner-application/data/partner-country-options.ts -msgid "Samoa 🇼🇸" -msgstr "Samoa 🇼🇸" - -#. js-lingui-id: fK288K -#: src/partner-application/data/partner-country-options.ts -msgid "San Marino 🇸🇲" -msgstr "San Marino 🇸🇲" - -#. js-lingui-id: KDcBQd -#: src/partner-application/data/partner-country-options.ts -msgid "São Tomé & Príncipe 🇸🇹" -msgstr "São Tomé & Príncipe 🇸🇹" - -#. js-lingui-id: /BK0Nl -#: src/partner-application/data/partner-country-options.ts -msgid "Saudi Arabia 🇸🇦" -msgstr "Saudi Arabia 🇸🇦" - -#. js-lingui-id: elz5ka -#: src/case-studies/case-study-catalog.ts -msgid "Saved / month" -msgstr "Saved / month" - -#. js-lingui-id: h3C5H8 -#: src/platform/releases/release-notes.tsx -msgid "Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace." -msgstr "Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace." - -#. js-lingui-id: bifv6N -#: src/case-studies/case-study-stories.ts -msgid "Scale" -msgstr "Scale" - -#. js-lingui-id: aI/fdL -#: src/case-studies/case-study-stories.ts -msgid "Scale without *breaking operations*" -msgstr "Scale without *breaking operations*" - -#. js-lingui-id: 842ybw -#: src/case-studies/case-study-stories.ts -msgid "Scale without breaking operations" -msgstr "Scale without breaking operations" - -#. js-lingui-id: vk6sVR -#: src/partner-application/partner-application-copy.ts -msgid "Search a country…" -msgstr "Search a country…" - -#. js-lingui-id: +yNkue -#: src/platform/releases/release-notes.tsx -msgid "Search in field pickers and add-column menus makes table and layout customization faster." -msgstr "Search in field pickers and add-column menus makes table and layout customization faster." - -#. js-lingui-id: HVOGoW -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Seats limit" -msgstr "Seats limit" - -#. js-lingui-id: a3LDKx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Security" -msgstr "Security" - -#. js-lingui-id: nmVU/t -#: src/sections/customers-hero/customers-hero.tsx -msgid "" -"See how teams\n" -"build *on Twenty*" -msgstr "" -"See how teams\n" -"build *on Twenty*" - -#. js-lingui-id: aB+XpI -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "See more features" -msgstr "See more features" - -#. js-lingui-id: JDp1bg -#: src/sections/three-cards/product-three-cards-data.ts -msgid "See updates as they happen. Work with your team and agents seamlessly." -msgstr "See updates as they happen. Work with your team and agents seamlessly." - -#. js-lingui-id: 0kgOPB -#. placeholder {0}: LATEST_RELEASE.release -#: src/sections/menu/menu.data.ts -msgid "See what shipped in {0}" -msgstr "See what shipped in {0}" - -#. js-lingui-id: 02ePaq -#. placeholder {0}: company.name -#: src/sections/product-feature/contacts-visual.tsx -msgid "Select {0}" -msgstr "Select {0}" - -#. js-lingui-id: wgNoIs -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -msgid "Select all" -msgstr "Select all" - -#. js-lingui-id: 6p/m5q -#: src/partner-application/partner-application-copy.ts -msgid "Select your country" -msgstr "Select your country" - -#. js-lingui-id: sXYD/i -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "self" -msgstr "self" - -#. js-lingui-id: 6JhL+3 -#: src/case-studies/case-study-catalog.ts -msgid "Self-hosted" -msgstr "Self-hosted" - -#. js-lingui-id: QFK/45 -#: src/partner-application/data/partner-scope-options.ts -msgid "Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring" -msgstr "Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring" - -#. js-lingui-id: 42Nf4Y -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted *means control*" -msgstr "Self-hosted *means control*" - -#. js-lingui-id: zuU9UU -#: src/platform/releases/release-notes.tsx -msgid "Self-hosted billing" -msgstr "Self-hosted billing" - -#. js-lingui-id: 5CWy3T -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs." -msgstr "Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs." - -#. js-lingui-id: 5WmQ5O -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted means control" -msgstr "Self-hosted means control" - -#. js-lingui-id: WxVgfh -#: src/platform/releases/release-notes.tsx -msgid "Self-hosted workspaces can now track usage more cleanly with usage-based billing support." -msgstr "Self-hosted workspaces can now track usage more cleanly with usage-based billing support." - -#. js-lingui-id: GrBvv/ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Self-hosting" -msgstr "Self-hosting" - -#. js-lingui-id: YdhUoe -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Self-hosting, now for rent!" -msgstr "Self-hosting, now for rent!" - -#. js-lingui-id: uVBq8r -#: src/platform/releases/release-notes.tsx -msgid "Self-Onboarding" -msgstr "Self-Onboarding" - -#. js-lingui-id: NaHz2o -#: src/sections/pricing-plans/self-host-toggle.tsx -msgid "Selfhosting" -msgstr "Selfhosting" - -#. js-lingui-id: pi1oME -#: src/app-preview/terminal/terminal-send-button.tsx -msgid "Send message" -msgstr "Send message" - -#. js-lingui-id: D50Vyu -#: src/partner-application/data/partner-country-options.ts -msgid "Senegal 🇸🇳" -msgstr "Senegal 🇸🇳" - -#. js-lingui-id: eEJlq0 -#: src/partner-application/data/partner-country-options.ts -msgid "Serbia 🇷🇸" -msgstr "Serbia 🇷🇸" - -#. js-lingui-id: 62gxWx -#: src/partner-application/data/partner-country-options.ts -msgid "Seychelles 🇸🇨" -msgstr "Seychelles 🇸🇨" - -#. js-lingui-id: 3VFzsh -#: src/sections/helped/helped.data.ts -msgid "Ship a product on Twenty" -msgstr "Ship a product on Twenty" - -#. js-lingui-id: Ta0ts5 -#: src/app-preview/terminal/diff/diff-pill.tsx -msgid "Show changes" -msgstr "Show changes" - -#. js-lingui-id: 6lGV3K -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Show less" -msgstr "Show less" - -#. js-lingui-id: RhU4bB -#: src/partners-marketplace/filter-bar.tsx -msgid "Showing {visibleCount} of {totalCount} partners" -msgstr "Showing {visibleCount} of {totalCount} partners" - -#. js-lingui-id: I89wN/ -#: src/partners-marketplace/filter-bar.tsx -msgid "Showing all {totalCount} partners" -msgstr "Showing all {totalCount} partners" - -#. js-lingui-id: 9k9PMD -#: src/platform/releases/release-notes.tsx -msgid "Sidebar items" -msgstr "Sidebar items" - -#. js-lingui-id: yhyNch -#: src/partner-application/data/partner-country-options.ts -msgid "Sierra Leone 🇸🇱" -msgstr "Sierra Leone 🇸🇱" - -#. js-lingui-id: mA6cL1 -#: src/sections/faq/faq.data.ts -msgid "Sign up for Cloud in under a minute and start your 30-day trial. For larger rollouts, our 4-hour Onboarding Packs or certified partners get you live in 1–2 weeks." -msgstr "Sign up for Cloud in under a minute and start your 30-day trial. For larger rollouts, our 4-hour Onboarding Packs or certified partners get you live in 1–2 weeks." - -#. js-lingui-id: qTFDyz -#: src/sections/pricing-plans/pricing-intro.tsx -msgid "" -"Simple\n" -"*Pricing*" -msgstr "" -"Simple\n" -"*Pricing*" - -#. js-lingui-id: 0eG5g+ -#: src/partner-application/data/partner-country-options.ts -msgid "Singapore 🇸🇬" -msgstr "Singapore 🇸🇬" - -#. js-lingui-id: V9dFwD -#: src/sections/footer/footer.data.ts -msgid "Sitemap" -msgstr "Sitemap" - -#. js-lingui-id: c+cRP3 -#: src/platform/releases/release-notes.tsx -msgid "Skeleton Loading" -msgstr "Skeleton Loading" - -#. js-lingui-id: PCSkw2 -#: src/partners-marketplace/partner-profile.tsx -msgid "Skills" -msgstr "Skills" - -#. js-lingui-id: t6ComU -#: src/sections/feature-cards/feature-cards.tsx -msgid "Skip the clunky UX that always comes with custom." -msgstr "Skip the clunky UX that always comes with custom." - -#. js-lingui-id: U7keXg -#: src/partner-application/data/partner-country-options.ts -msgid "Slovakia 🇸🇰" -msgstr "Slovakia 🇸🇰" - -#. js-lingui-id: o1VTTF -#: src/partner-application/data/partner-country-options.ts -msgid "Slovenia 🇸🇮" -msgstr "Slovenia 🇸🇮" - -#. js-lingui-id: 1v/aHN -#: src/platform/releases/release-notes.tsx -msgid "Smart ⌘K" -msgstr "Smart ⌘K" - -#. js-lingui-id: bUmSwL -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute." -msgstr "Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute." - -#. js-lingui-id: GUqjZ0 -#: src/sections/footer/footer-bottom.tsx -msgid "Social media" -msgstr "Social media" - -#. js-lingui-id: b+F/Ih -#: src/platform/releases/release-notes.tsx -msgid "Soft Delete" -msgstr "Soft Delete" - -#. js-lingui-id: L58Ivq -#: src/platform/releases/release-notes.tsx -msgid "Soft delete feature added: Deleted records are now hidden from view but recoverable from the \"Deleted record\" option in any object options menu. No more drama!" -msgstr "Soft delete feature added: Deleted records are now hidden from view but recoverable from the \"Deleted record\" option in any object options menu. No more drama!" - -#. js-lingui-id: 6sKjjx -#: src/partner-application/data/partner-team-type-options.ts -msgid "Solo" -msgstr "Solo" - -#. js-lingui-id: FX2oa1 -#: src/partner-application/partner-application-copy.ts -msgid "Solo or agency?" -msgstr "Solo or agency?" - -#. js-lingui-id: TcZtfs -#: src/partner-application/data/partner-country-options.ts -msgid "Solomon Islands 🇸🇧" -msgstr "Solomon Islands 🇸🇧" - -#. js-lingui-id: TvdMI3 -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Solutioning" -msgstr "Solutioning" - -#. js-lingui-id: t1E06j -#: src/partner-application/data/partner-country-options.ts -msgid "Somalia 🇸🇴" -msgstr "Somalia 🇸🇴" - -#. js-lingui-id: AVfp38 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons." -msgstr "Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons." - -#. js-lingui-id: Lllsp+ -#: src/platform/releases/release-notes.tsx -msgid "Some teammate changes now appear right away, so collaboration feels faster and more up to date." -msgstr "Some teammate changes now appear right away, so collaboration feels faster and more up to date." - -#. js-lingui-id: B/mYo/ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Source code access" -msgstr "Source code access" - -#. js-lingui-id: zHJB/O -#: src/partner-application/data/partner-country-options.ts -msgid "South Africa 🇿🇦" -msgstr "South Africa 🇿🇦" - -#. js-lingui-id: 7MdTKh -#: src/partner-application/data/partner-country-options.ts -msgid "South Korea 🇰🇷" -msgstr "South Korea 🇰🇷" - -#. js-lingui-id: a4jo+V -#: src/partner-application/data/partner-country-options.ts -msgid "South Sudan 🇸🇸" -msgstr "South Sudan 🇸🇸" - -#. js-lingui-id: Kv3C8d -#: src/partner-application/data/partner-country-options.ts -msgid "Spain 🇪🇸" -msgstr "Spain 🇪🇸" - -#. js-lingui-id: 65A04M -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Spanish" -msgstr "Spanish" - -#. js-lingui-id: 00jcbn -#: src/partner-application/data/partner-country-options.ts -msgid "Sri Lanka 🇱🇰" -msgstr "Sri Lanka 🇱🇰" - -#. js-lingui-id: vnS6Rf -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "SSO" -msgstr "SSO" - -#. js-lingui-id: uQl22y -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Standard support" -msgstr "Standard support" - -#. js-lingui-id: wxW2Sv -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Start automating at huge scale!" -msgstr "Start automating at huge scale!" - -#. js-lingui-id: XO628f -#: src/sections/pricing-plans/plan-card.tsx -msgid "Start for free" -msgstr "Start for free" - -#. js-lingui-id: sBOFB0 -#: src/sections/pricing-plans/pricing-intro.tsx -msgid "" -"Start your free trial today\n" -"without credit card." -msgstr "" -"Start your free trial today\n" -"without credit card." - -#. js-lingui-id: ThcPyu -#: src/sections/stepper/stepper.data.ts -msgid "Stay in control with our *open-source software*" -msgstr "Stay in control with our *open-source software*" - -#. js-lingui-id: j9c8rb -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Stay in Flow" -msgstr "Stay in Flow" - -#. js-lingui-id: GdGiNi -#: src/partner-application/partner-application-copy.ts -msgid "Step {current} of {total}" -msgstr "Step {current} of {total}" - -#. js-lingui-id: bxgoJR -#: src/sections/menu/menu.data.ts -msgid "Step-by-step guides and playbooks to help your team get the most out of their workspace." -msgstr "Step-by-step guides and playbooks to help your team get the most out of their workspace." - -#. js-lingui-id: jKt86V -#: src/sections/faq/faq.tsx -msgid "Stop fighting custom. *Start building, with Twenty*" -msgstr "Stop fighting custom. *Start building, with Twenty*" - -#. js-lingui-id: UCLArd -#: src/sections/three-cards/three-cards.tsx -#: src/sections/three-cards/product-three-cards.tsx -msgid "Stop settling for trade-offs." -msgstr "Stop settling for trade-offs." - -#. js-lingui-id: hjgBcp -#: src/platform/releases/release-notes.tsx -msgid "Stop Workflow Button" -msgstr "Stop Workflow Button" - -#. js-lingui-id: 3QIOGT -#: src/platform/releases/release-notes.tsx -msgid "Sub-field Filtering" -msgstr "Sub-field Filtering" - -#. js-lingui-id: eVPr22 -#: src/platform/releases/release-notes.tsx -msgid "Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field." -msgstr "Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field." - -#. js-lingui-id: Sv4BSp -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Subdomain (yourco.twenty.com)" -msgstr "Subdomain (yourco.twenty.com)" - -#. js-lingui-id: H5/rZQ -#: src/partner-application/partner-application-copy.ts -msgid "Submit application" -msgstr "Submit application" - -#. js-lingui-id: MDqQmP -#: src/partner-application/partner-application-copy.ts -msgid "Submitting…" -msgstr "Submitting…" - -#. js-lingui-id: 8Z1557 -#: src/partner-application/data/partner-country-options.ts -msgid "Sudan 🇸🇩" -msgstr "Sudan 🇸🇩" - -#. js-lingui-id: XYLcNv -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Support" -msgstr "Support" - -#. js-lingui-id: Aq66kg -#: src/partner-application/data/partner-country-options.ts -msgid "Suriname 🇸🇷" -msgstr "Suriname 🇸🇷" - -#. js-lingui-id: Yz+oFV -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Swahili" -msgstr "Swahili" - -#. js-lingui-id: 6u3kqB -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "swap" -msgstr "swap" - -#. js-lingui-id: b2//Ip -#: src/partner-application/data/partner-country-options.ts -msgid "Sweden 🇸🇪" -msgstr "Sweden 🇸🇪" - -#. js-lingui-id: UaISq3 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Swedish" -msgstr "Swedish" - -#. js-lingui-id: IImT5c -#: src/partner-application/data/partner-country-options.ts -msgid "Switzerland 🇨🇭" -msgstr "Switzerland 🇨🇭" - -#. js-lingui-id: sjuSub -#: src/partner-application/data/partner-country-options.ts -msgid "Syria 🇸🇾" -msgstr "Syria 🇸🇾" - -#. js-lingui-id: 3w+Aox -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Table, Kanban, Calendar" -msgstr "Table, Kanban, Calendar" - -#. js-lingui-id: ISVD3+ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Tagalog" -msgstr "Tagalog" - -#. js-lingui-id: 9M02G5 -#: src/sections/stepper/product-stepper-data.ts -msgid "Tailor record pages, menus, and views" -msgstr "Tailor record pages, menus, and views" - -#. js-lingui-id: boABlR -#: src/partner-application/data/partner-country-options.ts -msgid "Taiwan 🇹🇼" -msgstr "Taiwan 🇹🇼" - -#. js-lingui-id: XJspRJ -#: src/partner-application/data/partner-country-options.ts -msgid "Tajikistan 🇹🇯" -msgstr "Tajikistan 🇹🇯" - -#. js-lingui-id: jYsF4G -#: src/platform/releases/release-notes.tsx -msgid "Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time." -msgstr "Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time." - -#. js-lingui-id: JAKtcG -#: src/sections/product-hero/product-hero.tsx -#: src/sections/home-hero/home-hero.tsx -#: src/sections/footer/footer.data.ts -#: src/sections/faq/faq.tsx -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -#: src/contact-cal/contact-cal-modal.tsx -msgid "Talk to us" -msgstr "Talk to us" - -#. js-lingui-id: fb427h -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Tamil" -msgstr "Tamil" - -#. js-lingui-id: ri1l89 -#: src/partner-application/data/partner-country-options.ts -msgid "Tanzania 🇹🇿" -msgstr "Tanzania 🇹🇿" - -#. js-lingui-id: GWMpL3 -#: src/sections/product-feature/feature-tiles.ts -msgid "Tasks & Activities" -msgstr "Tasks & Activities" - -#. js-lingui-id: Ye3KKA -#: src/sections/menu/menu.data.ts -msgid "Team up with a Twenty expert" -msgstr "Team up with a Twenty expert" - -#. js-lingui-id: vsdUaL -#: src/sections/releases-hero/releases-hero.tsx -msgid "Technical notes" -msgstr "Technical notes" - -#. js-lingui-id: y+bLyB -#: src/partner-application/partner-application-copy.ts -msgid "Technical skills" -msgstr "Technical skills" - -#. js-lingui-id: Hevu8X -#: src/app-preview/terminal/terminal-toggle.tsx -msgid "Terminal mode" -msgstr "Terminal mode" - -#. js-lingui-id: mvP/25 -#: src/sections/footer/footer.data.ts -msgid "Terms and Conditions" -msgstr "Terms and Conditions" - -#. js-lingui-id: xowcRf -#: src/app/[locale]/(site)/terms/page.tsx -msgid "Terms of Service" -msgstr "Terms of Service" - -#. js-lingui-id: BEX1RA -#: src/platform/routing/static-website-routes.ts -msgid "Terms of Service | Twenty" -msgstr "Terms of Service | Twenty" - -#. js-lingui-id: VUZDlr -#: src/sections/testimonials/testimonials-carousel.tsx -msgid "Testimonials" -msgstr "Testimonials" - -#. js-lingui-id: SUr44j -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Thai" -msgstr "Thai" - -#. js-lingui-id: 6t7gpr -#: src/partner-application/data/partner-country-options.ts -msgid "Thailand 🇹🇭" -msgstr "Thailand 🇹🇭" - -#. js-lingui-id: Pa/Y6/ -#: src/partner-application/partner-application-copy.ts -msgid "" -"Thanks, you're in.\n" -"*Now book your intro call.*" -msgstr "" -"Thanks, you're in.\n" -"*Now book your intro call.*" - -#. js-lingui-id: FjkPYg -#: src/case-studies/case-study-stories.ts -msgid "That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients." -msgstr "That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients." - -#. js-lingui-id: 8S4psU -#: src/case-studies/case-study-stories.ts -msgid "That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer." -msgstr "That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer." - -#. js-lingui-id: zXlFuT -#: src/platform/routing/static-website-routes.ts -msgid "The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business." -msgstr "The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business." - -#. js-lingui-id: K1T7Mn -#: src/platform/releases/release-notes.tsx -msgid "The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record." -msgstr "The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record." - -#. js-lingui-id: KzqOXm -#: src/platform/releases/release-notes.tsx -msgid "The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \"Retail,\" \"Technology,\" and \"Finance,\" enabling more nuanced segmentation and analysis." -msgstr "The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \"Retail,\" \"Technology,\" and \"Finance,\" enabling more nuanced segmentation and analysis." - -#. js-lingui-id: 6wVgAW -#: src/case-studies/case-study-stories.ts -msgid "The bet is *paying off*" -msgstr "The bet is *paying off*" - -#. js-lingui-id: NT2bSJ -#: src/case-studies/case-study-stories.ts -msgid "The bet is paying off" -msgstr "The bet is paying off" - -#. js-lingui-id: Wie492 -#: src/case-studies/case-study-stories.ts -msgid "The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in." -msgstr "The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in." - -#. js-lingui-id: 2kHqXc -#: src/case-studies/case-study-stories.ts -msgid "The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them." -msgstr "The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them." - -#. js-lingui-id: EYi+kT -#: src/case-studies/case-study-stories.ts -msgid "The CRM as a *control hub*" -msgstr "The CRM as a *control hub*" - -#. js-lingui-id: 2sfVd8 -#: src/case-studies/case-study-stories.ts -msgid "The CRM as a control hub" -msgstr "The CRM as a control hub" - -#. js-lingui-id: XlFsoH -#: src/case-studies/case-study-stories.ts -msgid "The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant." -msgstr "The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant." - -#. js-lingui-id: kCUcnD -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed." -msgstr "The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed." - -#. js-lingui-id: MaHqAc -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -msgid "The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly." -msgstr "The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly." - -#. js-lingui-id: Q5iZ9Q -#: src/case-studies/case-study-stories.ts -msgid "The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy." -msgstr "The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy." - -#. js-lingui-id: l0eUFC -#: src/case-studies/case-study-stories.ts -msgid "The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever." -msgstr "The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever." - -#. js-lingui-id: SW9clW -#: src/sections/why-twenty-hero/why-twenty-hero.tsx -msgid "The future of CRM is built, *not bought.*" -msgstr "The future of CRM is built, *not bought.*" - -#. js-lingui-id: sm10Rg -#: src/sections/problem/problem.data.ts -msgid "The Giant Monolith" -msgstr "The Giant Monolith" - -#. js-lingui-id: nFB8I1 -#: src/sections/problem/problem.data.ts -msgid "The In-house Burden" -msgstr "The In-house Burden" - -#. js-lingui-id: ZNzKXV -#: src/case-studies/case-study-stories.ts -msgid "The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic." -msgstr "The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic." - -#. js-lingui-id: nf1NnD -#: src/platform/releases/release-notes.tsx -msgid "The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields." -msgstr "The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields." - -#. js-lingui-id: tADBQB -#: src/platform/releases/release-notes.tsx -msgid "The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads." -msgstr "The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads." - -#. js-lingui-id: q1kKLq -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "The opportunity" -msgstr "The opportunity" - -#. js-lingui-id: 80f4ed -#: src/sections/menu/menu.data.ts -msgid "The principles and product philosophy behind the open source CRM." -msgstr "The principles and product philosophy behind the open source CRM." - -#. js-lingui-id: 2NJdyz -#: src/sections/problem/problem.tsx -msgid "The Problem." -msgstr "The Problem." - -#. js-lingui-id: GTy93s -#: src/platform/releases/release-notes.tsx -msgid "The record page now features a clearer layout with increased space for content" -msgstr "The record page now features a clearer layout with increased space for content" - -#. js-lingui-id: 3/wAFg -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "The result" -msgstr "The result" - -#. js-lingui-id: nAWeyi -#: src/case-studies/case-study-stories.ts -msgid "The result is a system that fits how AC&T already worked, instead of the other way around." -msgstr "The result is a system that fits how AC&T already worked, instead of the other way around." - -#. js-lingui-id: WENmFq -#: src/case-studies/case-study-stories.ts -msgid "The right *foundation*" -msgstr "The right *foundation*" - -#. js-lingui-id: nbHA9N -#: src/case-studies/case-study-stories.ts -msgid "The right foundation" -msgstr "The right foundation" - -#. js-lingui-id: g8h2v+ -#: src/platform/releases/release-notes.tsx -msgid "The search feature now includes ranking scores. This helps you find the most relevant results faster." -msgstr "The search feature now includes ranking scores. This helps you find the most relevant results faster." - -#. js-lingui-id: 9CCRtB -#: src/platform/releases/release-notes.tsx -msgid "The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results." -msgstr "The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results." - -#. js-lingui-id: omVXTg -#: src/case-studies/case-study-stories.ts -msgid "The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source." -msgstr "The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source." - -#. js-lingui-id: 1tN3qf -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "The shift" -msgstr "The shift" - -#. js-lingui-id: iW6MjB -#: src/platform/releases/release-notes.tsx -msgid "The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature." -msgstr "The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature." - -#. js-lingui-id: AnGOwN -#: src/case-studies/case-study-stories.ts -msgid "The situation" -msgstr "The situation" - -#. js-lingui-id: gXGp3Q -#: src/sections/menu/menu.data.ts -msgid "The story behind Twenty" -msgstr "The story behind Twenty" - -#. js-lingui-id: axo4rg -#: src/platform/routing/static-website-routes.ts -msgid "The terms governing your use of Twenty and its open source CRM services." -msgstr "The terms governing your use of Twenty and its open source CRM services." - -#. js-lingui-id: xCAT8U -#: src/platform/releases/release-notes.tsx -msgid "The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events" -msgstr "The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events" - -#. js-lingui-id: u0uFxg -#: src/sections/testimonials/testimonials-carousel.tsx -msgid "They are the real sales" -msgstr "They are the real sales" - -#. js-lingui-id: 53RXLB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "They call it customer loyalty. We call it a very affectionate cage." -msgstr "They call it customer loyalty. We call it a very affectionate cage." - -#. js-lingui-id: RhmZMe -#: src/case-studies/case-study-stories.ts -msgid "They did not just replace a tool. They took back ownership of how their business runs." -msgstr "They did not just replace a tool. They took back ownership of how their business runs." - -#. js-lingui-id: ZnqwXn -#: src/case-studies/case-study-stories.ts -msgid "They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother." -msgstr "They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother." - -#. js-lingui-id: 5YzqyT -#: src/case-studies/case-study-stories.ts -msgid "They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control." -msgstr "They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control." - -#. js-lingui-id: AUV+TY -#: src/app-preview/terminal/thinking-indicator.tsx -msgid "Thinking" -msgstr "Thinking" - -#. js-lingui-id: 8gek0+ -#: src/platform/releases/release-notes.tsx -msgid "This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate." -msgstr "This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate." - -#. js-lingui-id: 6f8QUY -#: src/partner-application/data/partner-country-options.ts -msgid "Timor-Leste 🇹🇱" -msgstr "Timor-Leste 🇹🇱" - -#. js-lingui-id: WwTFtc -#: src/platform/releases/release-notes.tsx -msgid "To enhance privacy, you can now add specific email addresses to a blocklist within the \"Accounts\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals." -msgstr "To enhance privacy, you can now add specific email addresses to a blocklist within the \"Accounts\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals." - -#. js-lingui-id: ijf9QM -#: src/platform/releases/release-notes.tsx -msgid "To maintain the simplicity of Twenty, we are introducing \"Advanced Settings.\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings." -msgstr "To maintain the simplicity of Twenty, we are introducing \"Advanced Settings.\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings." - -#. js-lingui-id: DeTupk -#: src/partner-application/data/partner-country-options.ts -msgid "Togo 🇹🇬" -msgstr "Togo 🇹🇬" - -#. js-lingui-id: CocxTO -#: src/partner-application/data/partner-country-options.ts -msgid "Tonga 🇹🇴" -msgstr "Tonga 🇹🇴" - -#. js-lingui-id: 5eFktS -#: src/case-studies/case-study-catalog.ts -msgid "Tool integration" -msgstr "Tool integration" - -#. js-lingui-id: xv7HSr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "total per month with fixed cost" -msgstr "total per month with fixed cost" - -#. js-lingui-id: hmu++i -#: src/sections/product-feature/feature-tiles.ts -msgid "Track amount and close date" -msgstr "Track amount and close date" - -#. js-lingui-id: POzmFl -#: src/sections/menu/menu.data.ts -msgid "Track every release with changelogs, highlights and demos of the newest features." -msgstr "Track every release with changelogs, highlights and demos of the newest features." - -#. js-lingui-id: 6vHPh9 -#: src/sections/product-hero/product-hero.tsx -msgid "Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence." -msgstr "Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence." - -#. js-lingui-id: xwWQ9Q -#: src/partners-marketplace/partner-scope-labels.ts -msgid "Training & Adoption" -msgstr "Training & Adoption" - -#. js-lingui-id: MtCqjl -#: src/partner-application/data/partner-scope-options.ts -msgid "Training, Adoption & Support" -msgstr "Training, Adoption & Support" - -#. js-lingui-id: VhVAzf -#: src/platform/releases/release-notes.tsx -msgid "Translation in 30+ Languages" -msgstr "Translation in 30+ Languages" - -#. js-lingui-id: /ga9kq -#: src/partner-application/data/partner-country-options.ts -msgid "Trinidad & Tobago 🇹🇹" -msgstr "Trinidad & Tobago 🇹🇹" - -#. js-lingui-id: tdZpCd -#: src/sections/footer/footer.data.ts -msgid "Trust Center" -msgstr "Trust Center" - -#. js-lingui-id: HlusPQ -#: src/sections/pricing-salesfarce/pricing-salesfarce.tsx -msgid "Trust the n°1 CRM, *or not!*" -msgstr "Trust the n°1 CRM, *or not!*" - -#. js-lingui-id: KtyN0b -#: src/sections/trusted-by/trusted-by.tsx -msgid "trusted by" -msgstr "trusted by" - -#. js-lingui-id: QZdPWP -#: src/sections/trusted-by/trusted-by.tsx -msgid "Trusted by leading organizations" -msgstr "Trusted by leading organizations" - -#. js-lingui-id: eslLQF -#: src/sections/product-demo/product-demo.tsx -msgid "Try it live" -msgstr "Try it live" - -#. js-lingui-id: qhmtws -#: src/partners-marketplace/empty-state.tsx -msgid "Try removing some filters or browse all partners." -msgstr "Try removing some filters or browse all partners." - -#. js-lingui-id: E/hGy3 -#: src/sections/product-demo/product-demo.tsx -msgid "Try Twenty Cloud" -msgstr "Try Twenty Cloud" - -#. js-lingui-id: D5Kf4t -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours." -msgstr "Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours." - -#. js-lingui-id: y4UxlS -#: src/partner-application/data/partner-country-options.ts -msgid "Tunisia 🇹🇳" -msgstr "Tunisia 🇹🇳" - -#. js-lingui-id: UIDKnJ -#: src/partner-application/data/partner-country-options.ts -msgid "Turkey 🇹🇷" -msgstr "Turkey 🇹🇷" - -#. js-lingui-id: Kz91g/ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Turkish" -msgstr "Turkish" - -#. js-lingui-id: kdJl4v -#: src/partner-application/data/partner-country-options.ts -msgid "Turkmenistan 🇹🇲" -msgstr "Turkmenistan 🇹🇲" - -#. js-lingui-id: tSc/a3 -#: src/partner-application/data/partner-country-options.ts -msgid "Tuvalu 🇹🇻" -msgstr "Tuvalu 🇹🇻" - -#. js-lingui-id: O5dAmW -#: src/platform/routing/static-website-routes.ts -msgid "Twenty | #1 Open Source CRM" -msgstr "Twenty | #1 Open Source CRM" - -#. js-lingui-id: NalB1c -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform." -msgstr "Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform." - -#. js-lingui-id: fZsVj6 -#: src/case-studies/case-study-stories.ts -msgid "" -"Twenty as the\n" -"*API backbone* of a go-to-market stack" -msgstr "" -"Twenty as the\n" -"*API backbone* of a go-to-market stack" - -#. js-lingui-id: +w9xZW -#: src/case-studies/case-study-catalog.ts -msgid "Twenty as the API backbone of a go-to-market stack" -msgstr "Twenty as the API backbone of a go-to-market stack" - -#. js-lingui-id: zj0CA+ -#: src/case-studies/case-study-stories.ts -msgid "Twenty as the API backbone of a go-to-market stack | Elevate Consulting" -msgstr "Twenty as the API backbone of a go-to-market stack | Elevate Consulting" - -#. js-lingui-id: neM1Ol -#: src/platform/routing/static-website-routes.ts -msgid "Twenty CRM Features — Modern Open Source CRM Platform" -msgstr "Twenty CRM Features — Modern Open Source CRM Platform" - -#. js-lingui-id: 8zCqPL -#: src/platform/routing/static-website-routes.ts -msgid "Twenty CRM Pricing — Plans from $9 per User per Month" -msgstr "Twenty CRM Pricing — Plans from $9 per User per Month" - -#. js-lingui-id: D05UQH -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Customers — How Modern Teams Run Their CRM" -msgstr "Twenty Customers — How Modern Teams Run Their CRM" - -#. js-lingui-id: MYHdd/ -#: src/case-studies/case-study-stories.ts -msgid "Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market." -msgstr "Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market." - -#. js-lingui-id: fwep/o -#: src/case-studies/case-study-stories.ts -msgid "Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it." -msgstr "Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it." - -#. js-lingui-id: 0qyMhk -#: src/sections/home-hero/home-hero.tsx -msgid "Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves." -msgstr "Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves." - -#. js-lingui-id: jVhq41 -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform." -msgstr "Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform." - -#. js-lingui-id: x/I85y -#: src/case-studies/case-study-stories.ts -msgid "Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible." -msgstr "Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible." - -#. js-lingui-id: zvfdHM -#: src/case-studies/case-study-stories.ts -msgid "Twenty is the heart of the system. Everything branches from it." -msgstr "Twenty is the heart of the system. Everything branches from it." - -#. js-lingui-id: K+zzSQ -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "Twenty lets us build a CRM around the business and not the business around the CRM." -msgstr "Twenty lets us build a CRM around the business and not the business around the CRM." - -#. js-lingui-id: AxT+g4 -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Twenty makes it simple. It's clean, intuitive, and built to feel like Notion." -msgstr "Twenty makes it simple. It's clean, intuitive, and built to feel like Notion." - -#. js-lingui-id: mZ3xRm -#: src/sections/menu/menu.data.ts -msgid "Twenty partner ecosystem" -msgstr "Twenty partner ecosystem" - -#. js-lingui-id: 4SJucz -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Partners — Certified Open Source CRM Implementers" -msgstr "Twenty Partners — Certified Open Source CRM Implementers" - -#. js-lingui-id: vD7S1X -#. placeholder {0}: LATEST_RELEASE.release -#. placeholder {1}: LATEST_RELEASE.title -#: src/sections/menu/menu.data.ts -msgid "Twenty release {0} — {1}" -msgstr "Twenty release {0} — {1}" - -#. js-lingui-id: X1GHuJ -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Releases — What's New in the Open Source CRM" -msgstr "Twenty Releases — What's New in the Open Source CRM" - -#. js-lingui-id: V1lV7B -#: src/sections/pricing-plans/plans-data.ts -msgid "Twenty team support" -msgstr "Twenty team support" - -#. js-lingui-id: osa7Xg -#: src/sections/menu/menu.data.ts -msgid "Twenty user guide preview" -msgstr "Twenty user guide preview" - -#. js-lingui-id: KsFvUt -#: src/partners-marketplace/marketplace-header.tsx -msgid "Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call." -msgstr "Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call." - -#. js-lingui-id: tuvLv1 -#: src/platform/releases/release-notes.tsx -msgid "Two Factor Authentication" -msgstr "Two Factor Authentication" - -#. js-lingui-id: EIU345 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Two-factor authentication" -msgstr "Two-factor authentication" - -#. js-lingui-id: O+vc/1 -#: src/partner-application/partner-application-copy.ts -msgid "Type of team *" -msgstr "Type of team *" - -#. js-lingui-id: P+R1Lc -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Typical project" -msgstr "Typical project" - -#. js-lingui-id: HqFilh -#: src/partner-application/data/partner-country-options.ts -msgid "UAE 🇦🇪" -msgstr "UAE 🇦🇪" - -#. js-lingui-id: +WNTxL -#: src/partner-application/data/partner-country-options.ts -msgid "Uganda 🇺🇬" -msgstr "Uganda 🇺🇬" - -#. js-lingui-id: uxuy4l -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "UI theme" -msgstr "UI theme" - -#. js-lingui-id: tNfmmF -#: src/partner-application/data/partner-country-options.ts -msgid "UK 🇬🇧" -msgstr "UK 🇬🇧" - -#. js-lingui-id: z7UkhA -#: src/partner-application/data/partner-country-options.ts -msgid "Ukraine 🇺🇦" -msgstr "Ukraine 🇺🇦" - -#. js-lingui-id: V9+2pH -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Ukrainian" -msgstr "Ukrainian" - -#. js-lingui-id: jqzUyM -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Unavailable" -msgstr "Unavailable" - -#. js-lingui-id: Hix/m6 -#: src/sections/product-feature/feature-tiles.ts -msgid "Unified timeline (emails, events, tasks, notes, files)" -msgstr "Unified timeline (emails, events, tasks, notes, files)" - -#. js-lingui-id: NIuIk1 -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Unlimited" -msgstr "Unlimited" - -#. js-lingui-id: q7vKOJ -#: src/platform/releases/release-notes.tsx -msgid "Unlisted Views" -msgstr "Unlisted Views" - -#. js-lingui-id: aGpTSC -#: src/sections/pricing-plans/plans-data.ts -msgid "Up to 5 workspaces" -msgstr "Up to 5 workspaces" - -#. js-lingui-id: KQsreu -#: src/platform/releases/release-notes.tsx -msgid "Updated by" -msgstr "Updated by" - -#. js-lingui-id: SPdRRU -#: src/partner-application/data/partner-scope-options.ts -msgid "Upfront consulting, scoping, strategy." -msgstr "Upfront consulting, scoping, strategy." - -#. js-lingui-id: WLb3m4 -#: src/platform/releases/release-notes.tsx -msgid "Upgraded Search" -msgstr "Upgraded Search" - -#. js-lingui-id: 2vanwz -#: src/sections/product-feature/feature-tiles.ts -msgid "Upload, rename, preview, and manage files directly on records. Everything stays where it belongs." -msgstr "Upload, rename, preview, and manage files directly on records. Everything stays where it belongs." - -#. js-lingui-id: tmwuH9 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Urdu" -msgstr "Urdu" - -#. js-lingui-id: huOaG8 -#: src/partner-application/data/partner-country-options.ts -msgid "Uruguay 🇺🇾" -msgstr "Uruguay 🇺🇾" - -#. js-lingui-id: RCOibx -#: src/partners-marketplace/served-geo-labels.ts -msgid "US" -msgstr "US" - -#. js-lingui-id: LXHEIS -#: src/partner-application/data/partner-country-options.ts -msgid "USA 🇺🇸" -msgstr "USA 🇺🇸" - -#. js-lingui-id: Roaswv -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "User Guide" -msgstr "User Guide" - -#. js-lingui-id: 9iX1i3 -#: src/platform/releases/release-notes.tsx -msgid "User impersonation" -msgstr "User impersonation" - -#. js-lingui-id: 3XIgKU -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "User roles" -msgstr "User roles" - -#. js-lingui-id: UCUX2+ -#: src/partner-application/data/partner-scope-options.ts -msgid "User-side rollout & ongoing support." -msgstr "User-side rollout & ongoing support." - -#. js-lingui-id: FOOEtP -#: src/partner-application/data/partner-country-options.ts -msgid "Uzbekistan 🇺🇿" -msgstr "Uzbekistan 🇺🇿" - -#. js-lingui-id: CRXL2j -#: src/partner-application/data/partner-country-options.ts -msgid "Vanuatu 🇻🇺" -msgstr "Vanuatu 🇻🇺" - -#. js-lingui-id: NNeEYO -#: src/partner-application/data/partner-country-options.ts -msgid "Vatican 🇻🇦" -msgstr "Vatican 🇻🇦" - -#. js-lingui-id: BWzac4 -#: src/partner-application/data/partner-country-options.ts -msgid "Venezuela 🇻🇪" -msgstr "Venezuela 🇻🇪" - -#. js-lingui-id: fDWr8s -#: src/platform/releases/release-notes.tsx -msgid "Version control" -msgstr "Version control" - -#. js-lingui-id: FlQ1vR -#: src/partner-application/data/partner-country-options.ts -msgid "Vietnam 🇻🇳" -msgstr "Vietnam 🇻🇳" - -#. js-lingui-id: fROFIL -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Vietnamese" -msgstr "Vietnamese" - -#. js-lingui-id: BRBSny -#. placeholder {0}: partner.name -#: src/partners-marketplace/partner-card.tsx -msgid "View {0} on LinkedIn" -msgstr "View {0} on LinkedIn" - -#. js-lingui-id: V4nZs/ -#: src/platform/releases/release-notes.tsx -msgid "View Groups" -msgstr "View Groups" - -#. js-lingui-id: ITdNGt -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "View on LinkedIn" -msgstr "View on LinkedIn" - -#. js-lingui-id: 73lp8c -#: src/partners-marketplace/partner-card.tsx -msgid "View profile" -msgstr "View profile" - -#. js-lingui-id: BAzC1v -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "View types" -msgstr "View types" - -#. js-lingui-id: mHtVst -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Visualize your customers on a map!" -msgstr "Visualize your customers on a map!" - -#. js-lingui-id: CsHuOr -#: src/sections/three-cards/three-cards.data.ts -msgid "VP of Engineering" -msgstr "VP of Engineering" - -#. js-lingui-id: uRh799 -#: src/sections/testimonials/testimonials.data.ts -msgid "VP of Engineering at W3villa Technologies" -msgstr "VP of Engineering at W3villa Technologies" - -#. js-lingui-id: w2INie -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "VP of Engineering, W3villa Technologies" -msgstr "VP of Engineering, W3villa Technologies" - -#. js-lingui-id: s0tU5h -#: src/case-studies/case-study-stories.ts -msgid "W3Grads" -msgstr "W3Grads" - -#. js-lingui-id: R8BueT -#: src/case-studies/case-study-stories.ts -msgid "W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone." -msgstr "W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone." - -#. js-lingui-id: 7hHsoV -#: src/sections/helped/helped.data.ts -msgid "W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone." -msgstr "W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone." - -#. js-lingui-id: QBOUnd -#: src/case-studies/case-study-catalog.ts -msgid "W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing." -msgstr "W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing." - -#. js-lingui-id: 7q5Vjn -#: src/sections/three-cards/three-cards.data.ts -msgid "W3villa Technologies" -msgstr "W3villa Technologies" - -#. js-lingui-id: ZabLEt -#: src/case-studies/case-study-stories.ts -msgid "W3villa Technologies set out to solve it properly, not with a workaround, but with a product." -msgstr "W3villa Technologies set out to solve it properly, not with a workaround, but with a product." - -#. js-lingui-id: 3v2ipf -#: src/sections/three-cards/three-cards.data.ts -msgid "W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves." -msgstr "W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves." - -#. js-lingui-id: k1Pevc -#: src/platform/releases/release-notes.tsx -msgid "We are pleased to reopen the cloud subscription to everyone. No more waiting!" -msgstr "We are pleased to reopen the cloud subscription to everyone. No more waiting!" - -#. js-lingui-id: 8CHatv -#: src/partner-application/partner-application-copy.ts -msgid "We could not submit your application. Please try again in a moment." -msgstr "We could not submit your application. Please try again in a moment." - -#. js-lingui-id: ofRgSN -#: src/case-studies/case-study-stories.ts -msgid "We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." -msgstr "We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." - -#. js-lingui-id: MjWeUE -#: src/sections/testimonials/testimonials.data.ts -msgid "We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." -msgstr "We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." - -#. js-lingui-id: GVxbgf -#: src/platform/releases/release-notes.tsx -msgid "We have improved app performance, shaving off over 500ms on each page." -msgstr "We have improved app performance, shaving off over 500ms on each page." - -#. js-lingui-id: 6C4xTI -#: src/platform/releases/release-notes.tsx -msgid "We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks." -msgstr "We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks." - -#. js-lingui-id: l7iJRt -#: src/platform/releases/release-notes.tsx -msgid "We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV." -msgstr "We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV." - -#. js-lingui-id: d5CWI6 -#: src/sections/partner-hero/partner-hero.tsx -msgid "We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us." -msgstr "We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us." - -#. js-lingui-id: DFlq8J -#: src/platform/releases/release-notes.tsx -msgid "We’ve added an \"any field search\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \"Mobile,\" \"Office,\" or \"Direct Line\" field." -msgstr "We’ve added an \"any field search\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \"Mobile,\" \"Office,\" or \"Direct Line\" field." - -#. js-lingui-id: kenNyf -#: src/platform/releases/release-notes.tsx -msgid "We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars." -msgstr "We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars." - -#. js-lingui-id: 5CT1rV -#: src/platform/releases/release-notes.tsx -msgid "We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!" -msgstr "We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!" - -#. js-lingui-id: xBnjMX -#: src/platform/releases/release-notes.tsx -msgid "We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well." -msgstr "We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well." - -#. js-lingui-id: v1kQyJ -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Webhooks" -msgstr "Webhooks" - -#. js-lingui-id: ZhnM/K -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Webhooks (Change Data Capture)" -msgstr "Webhooks (Change Data Capture)" - -#. js-lingui-id: K4G86X -#: src/platform/releases/release-notes.tsx -msgid "Webhooks filter" -msgstr "Webhooks filter" - -#. js-lingui-id: FaPmsq -#: src/platform/releases/release-notes.tsx -msgid "Webhooks multi-object filtering" -msgstr "Webhooks multi-object filtering" - -#. js-lingui-id: hgDePr -#: src/partner-application/partner-application-copy.ts -msgid "Website or GitHub" -msgstr "Website or GitHub" - -#. js-lingui-id: Lx0cVD -#: src/partner-application/data/partner-scope-options.ts -msgid "What an admin can do without writing code." -msgstr "What an admin can do without writing code." - -#. js-lingui-id: Z34FQq -#: src/case-studies/case-study-stories.ts -msgid "What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company." -msgstr "What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company." - -#. js-lingui-id: phiBjc -#: src/sections/faq/faq.data.ts -msgid "What does Twenty cost?" -msgstr "What does Twenty cost?" - -#. js-lingui-id: WVQaGB -#: src/case-studies/case-study-stories.ts -msgid "What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible." -msgstr "What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible." - -#. js-lingui-id: iOAq7n -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "What is next" -msgstr "What is next" - -#. js-lingui-id: tWd6MT -#: src/case-studies/case-study-stories.ts -msgid "What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together." -msgstr "What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together." - -#. js-lingui-id: kRfFDB -#: src/partners-marketplace/partner-profile.tsx -msgid "What they do" -msgstr "What they do" - -#. js-lingui-id: aYRqmz -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "What this means" -msgstr "What this means" - -#. js-lingui-id: QCHIzm -#: src/partner-application/partner-application-copy.ts -msgid "What you cover *" -msgstr "What you cover *" - -#. js-lingui-id: 1kfjxX -#: src/case-studies/case-study-stories.ts -msgid "Whatever came next had to be something they could own." -msgstr "Whatever came next had to be something they could own." - -#. js-lingui-id: cs6VpJ -#: src/case-studies/case-study-stories.ts -msgid "When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop." -msgstr "When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop." - -#. js-lingui-id: chISDP -#: src/platform/releases/release-notes.tsx -msgid "When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects." -msgstr "When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects." - -#. js-lingui-id: qqPUvu -#: src/case-studies/case-study-stories.ts -msgid "When the channel is *the business*" -msgstr "When the channel is *the business*" - -#. js-lingui-id: JglRo/ -#: src/case-studies/case-study-stories.ts -msgid "When the channel is the business" -msgstr "When the channel is the business" - -#. js-lingui-id: nkkLPM -#: src/case-studies/case-study-stories.ts -msgid "When the vendor *pulled the plug*" -msgstr "When the vendor *pulled the plug*" - -#. js-lingui-id: DajeYD -#: src/case-studies/case-study-stories.ts -msgid "When the vendor pulled the plug" -msgstr "When the vendor pulled the plug" - -#. js-lingui-id: 8SbakK -#: src/case-studies/case-study-stories.ts -msgid "" -"When your CRM is\n" -"*the product*" -msgstr "" -"When your CRM is\n" -"*the product*" - -#. js-lingui-id: OQ41z8 -#: src/case-studies/case-study-catalog.ts -msgid "When your CRM is the product" -msgstr "When your CRM is the product" - -#. js-lingui-id: Svuneu -#: src/case-studies/case-study-stories.ts -msgid "When your CRM is the product: W3Grads on Twenty | W3villa Technologies" -msgstr "When your CRM is the product: W3Grads on Twenty | W3villa Technologies" - -#. js-lingui-id: 2O07UN -#: src/partners-marketplace/partner-profile.tsx -msgid "Where & how" -msgstr "Where & how" - -#. js-lingui-id: bGN8u+ -#: src/case-studies/case-study-stories.ts -msgid "While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty." -msgstr "While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty." - -#. js-lingui-id: DJlSwA -#: src/sections/menu/menu.data.ts -msgid "Why" -msgstr "Why" - -#. js-lingui-id: mrxgOV -#: src/sections/menu/menu.data.ts -msgid "Why teams choose Twenty" -msgstr "Why teams choose Twenty" - -#. js-lingui-id: 4sOVu+ -#: src/sections/footer/footer.data.ts -msgid "Why Twenty" -msgstr "Why Twenty" - -#. js-lingui-id: DH7vVZ -#: src/platform/routing/static-website-routes.ts -msgid "Why Twenty — The Open Source CRM Built to Be Customised" -msgstr "Why Twenty — The Open Source CRM Built to Be Customised" - -#. js-lingui-id: tetjz4 -#: src/sections/menu/menu.data.ts -msgid "Why Twenty illustration" -msgstr "Why Twenty illustration" - -#. js-lingui-id: 7KJZ0z -#: src/app-preview/stage/traffic-lights.tsx -msgid "Window controls" -msgstr "Window controls" - -#. js-lingui-id: V+BOYT -#: src/platform/releases/release-notes.tsx -msgid "With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control." -msgstr "With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control." - -#. js-lingui-id: edwOmb -#: src/platform/releases/release-notes.tsx -msgid "With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines." -msgstr "With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines." - -#. js-lingui-id: OKVlnc -#: src/case-studies/case-study-stories.ts -msgid "With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket." -msgstr "With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket." - -#. js-lingui-id: OX5bbs -#: src/partner-application/partner-application-copy.ts -msgid "Work email *" -msgstr "Work email *" - -#. js-lingui-id: 5VGHpF -#: src/platform/releases/release-notes.tsx -msgid "Workflow branches" -msgstr "Workflow branches" - -#. js-lingui-id: 9MLcn+ -#: src/platform/releases/release-notes.tsx -msgid "Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation." -msgstr "Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation." - -#. js-lingui-id: XYIks/ -#: src/platform/releases/release-notes.tsx -msgid "Workflow Bulk Select" -msgstr "Workflow Bulk Select" - -#. js-lingui-id: gDMfQI -#: src/platform/releases/release-notes.tsx -msgid "Workflow Filters" -msgstr "Workflow Filters" - -#. js-lingui-id: aNVMLK -#: src/platform/releases/release-notes.tsx -msgid "Workflow improvements" -msgstr "Workflow improvements" - -#. js-lingui-id: EnPi2W -#: src/platform/releases/release-notes.tsx -msgid "Workflow Iterator Node" -msgstr "Workflow Iterator Node" - -#. js-lingui-id: jN2u/p -#: src/platform/releases/release-notes.tsx -msgid "Workflow Search Node Limit" -msgstr "Workflow Search Node Limit" - -#. js-lingui-id: woYYQq -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Workflows" -msgstr "Workflows" - -#. js-lingui-id: OteDxj -#: src/case-studies/case-study-stories.ts -msgid "Workflows that *actually get used*" -msgstr "Workflows that *actually get used*" - -#. js-lingui-id: AzqmMJ -#: src/case-studies/case-study-stories.ts -msgid "Workflows that actually get used" -msgstr "Workflows that actually get used" - -#. js-lingui-id: pmUArF -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Workspace" -msgstr "Workspace" - -#. js-lingui-id: bwECg/ -#: src/partner-application/partner-application-copy.ts -msgid "Workspace URL, customer references, relevant links…" -msgstr "Workspace URL, customer references, relevant links…" - -#. js-lingui-id: p3ZD6C -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "X (opens in new tab)" -msgstr "X (opens in new tab)" - -#. js-lingui-id: zkWmBh -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Yearly" -msgstr "Yearly" - -#. js-lingui-id: S6izIJ -#: src/partner-application/data/partner-country-options.ts -msgid "Yemen 🇾🇪" -msgstr "Yemen 🇾🇪" - -#. js-lingui-id: l75CjT -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-content.tsx -msgid "Yes" -msgstr "Yes" - -#. js-lingui-id: bo6pUs -#: src/sections/faq/faq.data.ts -msgid "Yes, with our Apps framework. Scaffold an extension with `npx create-twenty-app` and ship custom objects, server-side logic functions, React components that render inside Twenty’s UI, AI skills and agents, views, and navigation, all in TypeScript, deployable to any workspace." -msgstr "Yes, with our Apps framework. Scaffold an extension with `npx create-twenty-app` and ship custom objects, server-side logic functions, React components that render inside Twenty’s UI, AI skills and agents, views, and navigation, all in TypeScript, deployable to any workspace." - -#. js-lingui-id: yIcBW6 -#: src/sections/faq/faq.data.ts -msgid "Yes. Every Cloud workspace ships with a native MCP server. Connect your AI assistant via OAuth and it can read and write your CRM data in natural language." -msgstr "Yes. Every Cloud workspace ships with a native MCP server. Connect your AI assistant via OAuth and it can read and write your CRM data in natural language." - -#. js-lingui-id: 8xYMYQ -#: src/sections/faq/faq.data.ts -msgid "Yes. Import your data via CSV, or use our API for 50,000+ records. Our partners can handle the full migration for you." -msgstr "Yes. Import your data via CSV, or use our API for 50,000+ records. Our partners can handle the full migration for you." - -#. js-lingui-id: 8m0eN9 -#: src/sections/faq/faq.data.ts -msgid "Yes. Twenty is the #1 Open Source CRM on GitHub. You can self-host to fully own your infrastructure, or run it on our managed cloud for a zero-ops setup." -msgstr "Yes. Twenty is the #1 Open Source CRM on GitHub. You can self-host to fully own your infrastructure, or run it on our managed cloud for a zero-ops setup." - -#. js-lingui-id: Q3GDrw -#: src/platform/releases/release-notes.tsx -msgid "You can now add your views to favorites for quick access and organize your favorites into folders for better management." -msgstr "You can now add your views to favorites for quick access and organize your favorites into folders for better management." - -#. js-lingui-id: wvm+7M -#: src/platform/releases/release-notes.tsx -msgid "You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions." -msgstr "You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions." - -#. js-lingui-id: Wg/o59 -#: src/platform/releases/release-notes.tsx -msgid "You can now create number fields that display a percentage instead of a regular number." -msgstr "You can now create number fields that display a percentage instead of a regular number." - -#. js-lingui-id: BAWUUs -#: src/platform/releases/release-notes.tsx -msgid "You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link." -msgstr "You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link." - -#. js-lingui-id: nbc7CM -#: src/platform/releases/release-notes.tsx -msgid "You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)" -msgstr "You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)" - -#. js-lingui-id: dCaNPC -#: src/platform/releases/release-notes.tsx -msgid "You can now edit one-to-many relations directly from the \"many side\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company." -msgstr "You can now edit one-to-many relations directly from the \"many side\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company." - -#. js-lingui-id: HX2309 -#: src/platform/releases/release-notes.tsx -msgid "You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field." -msgstr "You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field." - -#. js-lingui-id: /eqpqH -#: src/platform/releases/release-notes.tsx -msgid "You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created." -msgstr "You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created." - -#. js-lingui-id: HeaQGk -#: src/platform/releases/release-notes.tsx -msgid "You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience." -msgstr "You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience." - -#. js-lingui-id: l2z97k -#: src/platform/releases/release-notes.tsx -msgid "You can now link your Microsoft account to easily manage your messages and events right within your workspace." -msgstr "You can now link your Microsoft account to easily manage your messages and events right within your workspace." - -#. js-lingui-id: QN6ytb -#: src/platform/releases/release-notes.tsx -msgid "You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection." -msgstr "You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection." - -#. js-lingui-id: pYoGew -#: src/platform/releases/release-notes.tsx -msgid "You can now navigate from one object to another directly from the record detail page." -msgstr "You can now navigate from one object to another directly from the record detail page." - -#. js-lingui-id: mpOPSr -#: src/platform/releases/release-notes.tsx -msgid "You can now preview file attachments without downloading them." -msgstr "You can now preview file attachments without downloading them." - -#. js-lingui-id: PoxYsC -#: src/platform/releases/release-notes.tsx -msgid "You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons." -msgstr "You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons." - -#. js-lingui-id: S4LCu8 -#: src/platform/releases/release-notes.tsx -msgid "You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content." -msgstr "You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content." - -#. js-lingui-id: uS4RtA -#: src/platform/releases/release-notes.tsx -msgid "You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently" -msgstr "You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently" - -#. js-lingui-id: px+QAM -#: src/platform/releases/release-notes.tsx -msgid "You can now see who last updated a record" -msgstr "You can now see who last updated a record" - -#. js-lingui-id: OVoVQg -#: src/platform/releases/release-notes.tsx -msgid "You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace." -msgstr "You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace." - -#. js-lingui-id: eheMXY -#: src/platform/releases/release-notes.tsx -msgid "You can now trigger workflows when a record is created or updated." -msgstr "You can now trigger workflows when a record is created or updated." - -#. js-lingui-id: XEEpNj -#: src/platform/releases/release-notes.tsx -msgid "You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object." -msgstr "You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object." - -#. js-lingui-id: LJ3sTb -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter." -msgstr "You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter." - -#. js-lingui-id: AUzqeZ -#: src/platform/releases/release-notes.tsx -msgid "You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows." -msgstr "You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows." - -#. js-lingui-id: SfJVcK -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance." -msgstr "Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance." - -#. js-lingui-id: krHgj1 -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Your enterprise key" -msgstr "Your enterprise key" - -#. js-lingui-id: +dxjCu -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Your enterprise license has been activated successfully." -msgstr "Your enterprise license has been activated successfully." - -#. js-lingui-id: pEQiCY -#: src/partner-application/partner-application-copy.ts -msgid "Your name *" -msgstr "Your name *" - -#. js-lingui-id: fQATWn -#: src/sections/product-feature/feature-tiles.ts -msgid "Your network, fully mapped." -msgstr "Your network, fully mapped." - -#. js-lingui-id: sgod9b -#: src/platform/releases/release-notes.tsx -msgid "Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code." -msgstr "Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code." - -#. js-lingui-id: CgGN5T -#: src/partner-application/data/partner-country-options.ts -msgid "Zambia 🇿🇲" -msgstr "Zambia 🇿🇲" - -#. js-lingui-id: wHjFOw -#: src/case-studies/case-study-catalog.ts -msgid "Zero" -msgstr "Zero" - -#. js-lingui-id: ZvEoMq -#: src/case-studies/case-study-stories.ts -msgid "Zero manual work at the core. Full automation. Built on Twenty." -msgstr "Zero manual work at the core. Full automation. Built on Twenty." - -#. js-lingui-id: TT3YXb -#: src/partner-application/data/partner-country-options.ts -msgid "Zimbabwe 🇿🇼" -msgstr "Zimbabwe 🇿🇼" - -#. js-lingui-id: ACjxWW -#: src/app-preview/stage/traffic-lights.tsx -msgid "Zoom" -msgstr "Zoom" diff --git a/packages/twenty-website-redone/src/locales/es-ES.po b/packages/twenty-website-redone/src/locales/es-ES.po deleted file mode 100644 index 112f6d7f70..0000000000 --- a/packages/twenty-website-redone/src/locales/es-ES.po +++ /dev/null @@ -1,6384 +0,0 @@ -msgid "" -msgstr "" -"POT-Creation-Date: 2026-06-11 02:05+0500\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: @lingui/cli\n" -"Language: es-ES\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Plural-Forms: \n" - -#. js-lingui-id: BUIzFF -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "-33% off" -msgstr "" - -#. js-lingui-id: AGZHx4 -#: src/sections/product-hero/product-hero.tsx -msgid "...with AI that actually helps you *work faster*" -msgstr "" - -#. js-lingui-id: Z6mKXu -#. placeholder {0}: partner.name -#: src/app/[locale]/(site)/partners/profile/[slug]/page.tsx -msgid "{0} — Twenty Partner" -msgstr "" - -#. js-lingui-id: sGt3Jm -#. placeholder {0}: i18n._(card.attribution.company) -#: src/sections/three-cards/illustration-card.tsx -msgid "{0} case study" -msgstr "" - -#. js-lingui-id: jC5JCB -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "{count} Case Studies" -msgstr "" - -#. js-lingui-id: NSO/FI -#: src/partners-marketplace/partner-rates-panel.tsx -#: src/partners-marketplace/partner-money-row.tsx -msgid "{hourly}/hr" -msgstr "" - -#. js-lingui-id: rAP+km -#: src/partners-marketplace/filter-dropdown.tsx -msgid "{labelText} filter" -msgstr "" - -#. js-lingui-id: 7hlEpj -#. placeholder {0}: selected.size -#: src/partners-marketplace/filter-dropdown.tsx -msgid "{labelText} filter, {0} selected" -msgstr "" - -#. js-lingui-id: 0Qb9by -#: src/case-studies/case-study-stories.ts -msgid "*150 hours* saved every month" -msgstr "" - -#. js-lingui-id: k3IzYC -#: src/case-studies/case-study-stories.ts -msgid "*Zero manual work* at the core" -msgstr "" - -#. js-lingui-id: icND7o -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "/ seat / month - billed yearly" -msgstr "" - -#. js-lingui-id: XUqxHW -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "/user/month" -msgstr "" - -#. js-lingui-id: UEDohT -#: src/sections/footer/footer-bottom.tsx -msgid "© {year} – Twenty" -msgstr "" - -#. js-lingui-id: 2ygf/L -#: src/partner-application/partner-application-copy.ts -msgid "← Back" -msgstr "" - -#. js-lingui-id: 9j/bUt -#: src/partners-marketplace/back-to-marketplace-link.tsx -msgid "← Twenty partners" -msgstr "" - -#. js-lingui-id: foGG8A -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$105/user per month" -msgstr "" - -#. js-lingui-id: Bsq9GJ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$35/user per month" -msgstr "" - -#. js-lingui-id: mWSpW5 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$5/user per month" -msgstr "" - -#. js-lingui-id: JIwDAd -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$7000/org per month" -msgstr "" - -#. js-lingui-id: yVr18d -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" - -#. js-lingui-id: iK+ikF -#: src/sections/trusted-by/trusted-by.tsx -msgid "+10k others" -msgstr "" - -#. js-lingui-id: nRtVCK -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"+20% of net spend\n" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" - -#. js-lingui-id: BmAWVq -#: src/platform/releases/release-notes.tsx -msgid "<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management." -msgstr "" - -#. js-lingui-id: pQcyVv -#: src/platform/releases/release-notes.tsx -msgid "<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\"No Value\" Column: Cards that are not assigned to a specific value will now appear in a \"No Value\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked." -msgstr "" - -#. js-lingui-id: cCqojY -#: src/platform/releases/release-notes.tsx -msgid "<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access." -msgstr "" - -#. js-lingui-id: be30i9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$0" -msgstr "" - -#. js-lingui-id: 6inRXo -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"$1/orchestration run/org\n" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" - -#. js-lingui-id: EkIZkY -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$19" -msgstr "" - -#. js-lingui-id: 8r6DgO -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$9" -msgstr "" - -#. js-lingui-id: EHNAf2 -#: src/case-studies/case-study-catalog.ts -msgid "1 click" -msgstr "" - -#. js-lingui-id: qvNspm -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "1‑800‑YES‑SOFTWARE" -msgstr "" - -#. js-lingui-id: 6WQdu8 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "100 per minute" -msgstr "" - -#. js-lingui-id: uuKUqZ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"11 permissions\n" -"groups" -msgstr "" - -#. js-lingui-id: 2szX5S -#: src/partner-application/partner-application-copy.ts -msgid "150" -msgstr "" - -#. js-lingui-id: 9ntyY8 -#: src/case-studies/case-study-catalog.ts -msgid "150 hrs" -msgstr "" - -#. js-lingui-id: 2z1Znr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "2 years contract" -msgstr "" - -#. js-lingui-id: l6Vx4q -#: src/case-studies/case-study-catalog.ts -msgid "2,000+" -msgstr "" - -#. js-lingui-id: FKcV/y -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "2025" -msgstr "" - -#. js-lingui-id: PJgfBS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "3" -msgstr "" - -#. js-lingui-id: BL47wE -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"3 2 years contract\n" -"-33% off" -msgstr "" - -#. js-lingui-id: /jgC+9 -#: src/case-studies/case-study-catalog.ts -msgid "3 product lines" -msgstr "" - -#. js-lingui-id: 7SJhyh -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "30+" -msgstr "" - -#. js-lingui-id: Pdl2UE -#: src/case-studies/case-study-catalog.ts -msgid "4 tools" -msgstr "" - -#. js-lingui-id: 2ScEtE -#: src/sections/pricing-plans/plans-data.ts -msgid "5 workflow credits/month included" -msgstr "" - -#. js-lingui-id: hIKxCy -#: src/partner-application/partner-application-copy.ts -msgid "5,000" -msgstr "" - -#. js-lingui-id: Z2TH0F -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "50 per minute" -msgstr "" - -#. js-lingui-id: CiRGZ8 -#: src/sections/pricing-plans/plans-data.ts -msgid "50 workflow credits/year included" -msgstr "" - -#. js-lingui-id: tZvajW -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "6 workflows" -msgstr "" - -#. js-lingui-id: fHxYPM -#: src/case-studies/case-study-catalog.ts -msgid "90%+" -msgstr "" - -#. js-lingui-id: u6Xxdi -#: src/case-studies/case-study-stories.ts -msgid "A business that does not fit a *template*" -msgstr "" - -#. js-lingui-id: NLSM5L -#: src/case-studies/case-study-stories.ts -msgid "A business that does not fit a template" -msgstr "" - -#. js-lingui-id: SR9TmK -#: src/sections/product-hero/product-hero.tsx -msgid "A CRM for teams that *move fast*" -msgstr "" - -#. js-lingui-id: MXRINg -#: src/case-studies/case-study-stories.ts -msgid "" -"A CRM that\n" -"*grows* with you" -msgstr "" - -#. js-lingui-id: diWAWP -#: src/case-studies/case-study-catalog.ts -msgid "A CRM that grows with you" -msgstr "" - -#. js-lingui-id: och6cp -#: src/case-studies/case-study-stories.ts -msgid "A CRM that grows with you | NetZero & Twenty" -msgstr "" - -#. js-lingui-id: N3qsQD -#: src/case-studies/case-study-stories.ts -msgid "" -"A CRM they\n" -"*actually own*" -msgstr "" - -#. js-lingui-id: muZzEA -#: src/case-studies/case-study-catalog.ts -msgid "A CRM they actually own" -msgstr "" - -#. js-lingui-id: HSyZ9R -#: src/sections/problem/problem.tsx -msgid "A custom CRM gives your org an edge, *but building one* comes with *tradeoffs*" -msgstr "" - -#. js-lingui-id: Ll7vsZ -#: src/sections/product-demo/product-demo.tsx -msgid "A demo worth a *thousand words*" -msgstr "" - -#. js-lingui-id: uNIo/j -#: src/sections/three-cards/product-three-cards.tsx -msgid "A modern CRM with *an intuitive interface*" -msgstr "" - -#. js-lingui-id: sDJ4rX -#: src/platform/releases/release-notes.tsx -msgid "A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views." -msgstr "" - -#. js-lingui-id: aYUQpm -#: src/platform/releases/release-notes.tsx -msgid "A new maintenance mode helps admins pause workspace changes during sensitive operations." -msgstr "" - -#. js-lingui-id: P5BDuh -#: src/case-studies/case-study-stories.ts -msgid "A platform ready to *grow*" -msgstr "" - -#. js-lingui-id: rxMguZ -#: src/case-studies/case-study-stories.ts -msgid "A platform ready to grow" -msgstr "" - -#. js-lingui-id: vbJW8I -#: src/case-studies/case-study-stories.ts -msgid "" -"A real estate agency on WhatsApp built a\n" -"*CRM* around it" -msgstr "" - -#. js-lingui-id: hwoGni -#: src/case-studies/case-study-catalog.ts -msgid "A real estate agency on WhatsApp built a CRM around it" -msgstr "" - -#. js-lingui-id: WjUlJr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "A retro theme as a paid add-on is somehow the most believable part." -msgstr "" - -#. js-lingui-id: r9Msiv -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \"I want this\" and \"it's live\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption." -msgstr "" - -#. js-lingui-id: H1lDvm -#: src/platform/releases/release-notes.tsx -msgid "Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update." -msgstr "" - -#. js-lingui-id: c0RR2h -#: src/case-studies/case-study-stories.ts -msgid "About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together." -msgstr "" - -#. js-lingui-id: 41o3VS -#: src/case-studies/case-study-catalog.ts -msgid "AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control." -msgstr "" - -#. js-lingui-id: TuJiQF -#: src/sections/three-cards/three-cards.data.ts -#: src/case-studies/case-study-stories.ts -msgid "AC&T Education Migration" -msgstr "" - -#. js-lingui-id: yHUdh6 -#: src/case-studies/case-study-stories.ts -msgid "AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export." -msgstr "" - -#. js-lingui-id: MPzy5R -#: src/sections/three-cards/three-cards.data.ts -msgid "AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%." -msgstr "" - -#. js-lingui-id: J+A83M -#: src/sections/helped/helped.data.ts -msgid "AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%." -msgstr "" - -#. js-lingui-id: Kqfsda -#: src/platform/routing/static-website-routes.ts -msgid "Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance." -msgstr "" - -#. js-lingui-id: muhZ+X -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activating your enterprise license…" -msgstr "" - -#. js-lingui-id: +cggij -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activation failed. Please try again." -msgstr "" - -#. js-lingui-id: trCWSt -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activation response was incomplete." -msgstr "" - -#. js-lingui-id: Yyn/dP -#: src/partners-marketplace/active-filter-pills.tsx -msgid "Active filters" -msgstr "" - -#. js-lingui-id: iNSn2+ -#: src/platform/releases/release-notes.tsx -msgid "Add files directly to records so documents, screenshots, and other assets stay attached to the right work." -msgstr "" - -#. js-lingui-id: x0pZJy -#: src/platform/releases/release-notes.tsx -msgid "Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define." -msgstr "" - -#. js-lingui-id: woOp+c -#: src/sections/stepper/product-stepper-data.ts -msgid "Add objects and fields" -msgstr "" - -#. js-lingui-id: ZuoQMi -#: src/platform/releases/release-notes.tsx -msgid "Add records to filtered views" -msgstr "" - -#. js-lingui-id: l3+wiC -#: src/platform/releases/release-notes.tsx -msgid "Add rich text directly inside layouts with the new dedicated field widget." -msgstr "" - -#. js-lingui-id: ced+/c -#: src/platform/releases/release-notes.tsx -msgid "Add Several emails for one contact" -msgstr "" - -#. js-lingui-id: Y2K3rp -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Add-ons" -msgstr "" - -#. js-lingui-id: U4glZw -#: src/platform/releases/release-notes.tsx -msgid "Added \"Group By\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu." -msgstr "" - -#. js-lingui-id: 6u4D5m -#: src/platform/releases/release-notes.tsx -msgid "Address Field Type" -msgstr "" - -#. js-lingui-id: g1in8j -#: src/platform/releases/release-notes.tsx -msgid "Admin Panel" -msgstr "" - -#. js-lingui-id: Op7nVF -#: src/case-studies/case-study-stories.ts -msgid "Adoption" -msgstr "" - -#. js-lingui-id: SUk0w7 -#: src/platform/releases/release-notes.tsx -msgid "Advanced Email and Calendar Settings" -msgstr "" - -#. js-lingui-id: dePx/O -#: src/platform/releases/release-notes.tsx -msgid "Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction." -msgstr "" - -#. js-lingui-id: c0acMS -#: src/platform/releases/release-notes.tsx -msgid "Advanced filters" -msgstr "" - -#. js-lingui-id: JiIKww -#: src/platform/releases/release-notes.tsx -msgid "Advanced Settings" -msgstr "" - -#. js-lingui-id: 2050Pj -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Advisory & Discovery" -msgstr "" - -#. js-lingui-id: QjSFuI -#: src/partner-application/data/partner-country-options.ts -msgid "Afghanistan 🇦🇫" -msgstr "" - -#. js-lingui-id: StqEz0 -#: src/partners-marketplace/served-geo-labels.ts -msgid "Africa" -msgstr "" - -#. js-lingui-id: NmHsVh -#: src/partner-application/data/partner-team-type-options.ts -msgid "Agency" -msgstr "" - -#. js-lingui-id: vZKKhf -#: src/sections/product-feature/feature-tiles.ts -msgid "Aggregate, bar, line, and pie widgets" -msgstr "" - -#. js-lingui-id: HURF9k -#: src/platform/releases/release-notes.tsx -msgid "Aggregates" -msgstr "" - -#. js-lingui-id: rp2omj -#: src/case-studies/case-study-catalog.ts -msgid "Agribusiness" -msgstr "" - -#. js-lingui-id: jiGK6+ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "AI (Einstein)" -msgstr "" - -#. js-lingui-id: aUn7Ps -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "AI & Automations" -msgstr "" - -#. js-lingui-id: HbXHSp -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "AI agents" -msgstr "" - -#. js-lingui-id: WGXwzu -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain." -msgstr "" - -#. js-lingui-id: Rsxdfy -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "AI Agents with custom skills" -msgstr "" - -#. js-lingui-id: JHi+LN -#: src/platform/releases/release-notes.tsx -msgid "AI agents, chats, and MCP" -msgstr "" - -#. js-lingui-id: n2fhCy -#: src/platform/releases/release-notes.tsx -msgid "AI chat" -msgstr "" - -#. js-lingui-id: YeA2Ox -#: src/platform/releases/release-notes.tsx -msgid "AI Chat is easier to use with a cleaner experience and clearer model choices." -msgstr "" - -#. js-lingui-id: TfV/y9 -#: src/sections/three-cards/product-three-cards-data.ts -msgid "AI chat, settings, and records in a side panels for fast, single-screen access." -msgstr "" - -#. js-lingui-id: R+bwFB -#: src/sections/three-cards/three-cards.data.ts -msgid "AI for rapid iterations" -msgstr "" - -#. js-lingui-id: svfUwH -#: src/case-studies/case-study-stories.ts -msgid "AI in the *migration workflow*" -msgstr "" - -#. js-lingui-id: A6v5aI -#: src/case-studies/case-study-stories.ts -msgid "AI in the migration workflow" -msgstr "" - -#. js-lingui-id: t97j+F -#: src/case-studies/case-study-catalog.ts -msgid "AI-assisted" -msgstr "" - -#. js-lingui-id: 7xlBwk -#: src/partner-application/data/partner-country-options.ts -msgid "Albania 🇦🇱" -msgstr "" - -#. js-lingui-id: EszGq4 -#: src/partner-application/data/partner-country-options.ts -msgid "Algeria 🇩🇿" -msgstr "" - -#. js-lingui-id: LIGwFL -#: src/sections/three-cards/three-cards.data.ts -#: src/case-studies/case-study-stories.ts -msgid "Alternative Partners" -msgstr "" - -#. js-lingui-id: GDVvyT -#: src/case-studies/case-study-stories.ts -msgid "Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers." -msgstr "" - -#. js-lingui-id: CCrRuT -#: src/case-studies/case-study-catalog.ts -msgid "Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work." -msgstr "" - -#. js-lingui-id: UIu18Y -#: src/sections/three-cards/three-cards.data.ts -msgid "Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee." -msgstr "" - -#. js-lingui-id: +BHPrF -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "always" -msgstr "" - -#. js-lingui-id: iFLhqi -#: src/sections/testimonials/testimonials.data.ts -msgid "Amrendra Pratap Singh" -msgstr "" - -#. js-lingui-id: Sbiivs -#: src/partner-application/data/partner-country-options.ts -msgid "Andorra 🇦🇩" -msgstr "" - -#. js-lingui-id: Uv5eaJ -#: src/partner-application/data/partner-country-options.ts -msgid "Angola 🇦🇴" -msgstr "" - -#. js-lingui-id: qKANz3 -#: src/partner-application/data/partner-country-options.ts -msgid "Antigua & Barbuda 🇦🇬" -msgstr "" - -#. js-lingui-id: BfeCSx -#: src/platform/releases/release-notes.tsx -msgid "Any Field filter" -msgstr "" - -#. js-lingui-id: aGCcXe -#: src/sections/faq/faq.tsx -msgid "Any Questions?" -msgstr "" - -#. js-lingui-id: lgSvgF -#: src/partner-application/partner-application-copy.ts -msgid "Anything else we should know?" -msgstr "" - -#. js-lingui-id: pkMjbA -#: src/partner-application/data/partner-scope-options.ts -msgid "Anything that needs a developer." -msgstr "" - -#. js-lingui-id: dYZUP3 -#: src/partner-application/data/partner-scope-options.ts -msgid "Anything that needs devops skills." -msgstr "" - -#. js-lingui-id: AfiWqP -#: src/partners-marketplace/served-geo-labels.ts -msgid "APAC" -msgstr "" - -#. js-lingui-id: /AMVjF -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "APEX tutorials" -msgstr "" - -#. js-lingui-id: yKBF3l -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "API access" -msgstr "" - -#. js-lingui-id: 30KnZB -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "API calls" -msgstr "" - -#. js-lingui-id: 42FQ3y -#: src/case-studies/case-study-catalog.ts -msgid "API-first" -msgstr "" - -#. js-lingui-id: azQMHP -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "APIs are extra. Simplicity has a price." -msgstr "" - -#. js-lingui-id: MqJvvH -#: src/sections/menu/menu.data.ts -msgid "APIs, SDKs and webhooks to extend Twenty and ship apps on top of your CRM data." -msgstr "" - -#. js-lingui-id: k8I7/G -#: src/partner-application/partner-application-copy.ts -msgid "" -"Apply to build\n" -"*the future of CRM*" -msgstr "" - -#. js-lingui-id: LJCDxT -#: src/platform/routing/static-website-routes.ts -msgid "Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM." -msgstr "" - -#. js-lingui-id: 8HV3WN -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Arabic" -msgstr "" - -#. js-lingui-id: uicv6Z -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "Architecture" -msgstr "" - -#. js-lingui-id: fT9xVz -#: src/partner-application/data/partner-country-options.ts -msgid "Argentina 🇦🇷" -msgstr "" - -#. js-lingui-id: 3KxGep -#: src/partner-application/data/partner-country-options.ts -msgid "Armenia 🇦🇲" -msgstr "" - -#. js-lingui-id: S+Q+1d -#: src/sections/product-hero/product-hero.tsx -msgid "Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams." -msgstr "" - -#. js-lingui-id: 7UGCGX -#: src/sections/three-cards/three-cards.tsx -msgid "Assemble, iterate and adapt a robust CRM, *that's quick to flex*" -msgstr "" - -#. js-lingui-id: v7zTZl -#: src/sections/product-feature/feature-tiles.ts -msgid "Assign owners and due dates" -msgstr "" - -#. js-lingui-id: awzjg/ -#: src/platform/releases/release-notes.tsx -msgid "Attachment Visualizer" -msgstr "" - -#. js-lingui-id: fxL/Km -#: src/sections/product-feature/feature-tiles.ts -msgid "Attachments without the chaos." -msgstr "" - -#. js-lingui-id: y2W2Hg -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Audit logs" -msgstr "" - -#. js-lingui-id: tw0/s1 -#: src/partner-application/data/partner-country-options.ts -msgid "Australia 🇦🇺" -msgstr "" - -#. js-lingui-id: 4cf5s+ -#: src/partner-application/data/partner-country-options.ts -msgid "Austria 🇦🇹" -msgstr "" - -#. js-lingui-id: FFv0Vh -#: src/sections/stepper/product-stepper-data.ts -msgid "Automation" -msgstr "" - -#. js-lingui-id: SJ7WSP -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Available on YouTube!" -msgstr "" - -#. js-lingui-id: 8d+jRc -#: src/partner-application/data/partner-country-options.ts -msgid "Azerbaijan 🇦🇿" -msgstr "" - -#. js-lingui-id: iH8pgl -#: src/sections/case-study-detail/case-study-hero.tsx -msgid "Back" -msgstr "" - -#. js-lingui-id: wIoAQo -#: src/partner-application/data/partner-country-options.ts -msgid "Bahamas 🇧🇸" -msgstr "" - -#. js-lingui-id: Rhju1T -#: src/partner-application/data/partner-country-options.ts -msgid "Bahrain 🇧🇭" -msgstr "" - -#. js-lingui-id: LxzgmZ -#: src/partner-application/data/partner-country-options.ts -msgid "Bangladesh 🇧🇩" -msgstr "" - -#. js-lingui-id: rtcPS0 -#: src/partner-application/data/partner-country-options.ts -msgid "Barbados 🇧🇧" -msgstr "" - -#. js-lingui-id: RownlY -#: src/partners-marketplace/partner-facts-list.tsx -msgid "Based in" -msgstr "" - -#. js-lingui-id: jQLfIW -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Because apparently privacy feels more premium with a surcharge." -msgstr "" - -#. js-lingui-id: qEQv1F -#: src/case-studies/case-study-stories.ts -msgid "Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform." -msgstr "" - -#. js-lingui-id: uIG0OH -#: src/case-studies/case-study-stories.ts -msgid "Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites." -msgstr "" - -#. js-lingui-id: JGM+JO -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Because true orchestration means putting a dollar sign on every dramatic entrance." -msgstr "" - -#. js-lingui-id: Z7U/Og -#: src/case-studies/case-study-stories.ts -msgid "Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected." -msgstr "" - -#. js-lingui-id: kWm0dC -#: src/sections/partner-hero/partner-hero.tsx -msgid "" -"Become\n" -"*our partner*" -msgstr "" - -#. js-lingui-id: PKMHNe -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "become a genius!" -msgstr "" - -#. js-lingui-id: 6ZCRfT -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/partner-hero/partner-hero.tsx -msgid "Become a partner" -msgstr "" - -#. js-lingui-id: j+1dcz -#: src/platform/routing/static-website-routes.ts -msgid "Become a Twenty Partner — Apply" -msgstr "" - -#. js-lingui-id: 83Wi6G -#: src/sections/stepper/stepper.data.ts -msgid "Begin with production-grade *building blocks*" -msgstr "" - -#. js-lingui-id: 0TCnEf -#: src/partner-application/data/partner-country-options.ts -msgid "Belarus 🇧🇾" -msgstr "" - -#. js-lingui-id: qblg4t -#: src/partner-application/data/partner-country-options.ts -msgid "Belgium 🇧🇪" -msgstr "" - -#. js-lingui-id: pSF7xM -#: src/partner-application/data/partner-country-options.ts -msgid "Belize 🇧🇿" -msgstr "" - -#. js-lingui-id: Hds3Bq -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Bengali" -msgstr "" - -#. js-lingui-id: cTWkw3 -#: src/partner-application/data/partner-country-options.ts -msgid "Benin 🇧🇯" -msgstr "" - -#. js-lingui-id: SYfuGP -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Benjamin Reynolds" -msgstr "" - -#. js-lingui-id: YfjrMq -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Bertrams" -msgstr "" - -#. js-lingui-id: mzTjnf -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Better than Liquid Glass!" -msgstr "" - -#. js-lingui-id: T1oJwH -#: src/case-studies/case-study-stories.ts -msgid "Beyond *internal rollout*" -msgstr "" - -#. js-lingui-id: OPnz/X -#: src/partner-application/data/partner-country-options.ts -msgid "Bhutan 🇧🇹" -msgstr "" - -#. js-lingui-id: 8tzR0k -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Billing period" -msgstr "" - -#. js-lingui-id: BpyJwa -#: src/sections/menu/menu.data.ts -msgid "Blue developer illustration with branching arrows" -msgstr "" - -#. js-lingui-id: TVJDFA -#: src/partner-application/data/partner-country-options.ts -msgid "Bolivia 🇧🇴" -msgstr "" - -#. js-lingui-id: MkvsWx -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Book a call" -msgstr "" - -#. js-lingui-id: Wzdd8u -#: src/partner-application/data/partner-country-options.ts -msgid "Bosnia & Herzegovina 🇧🇦" -msgstr "" - -#. js-lingui-id: wtNsrt -#: src/partner-application/data/partner-country-options.ts -msgid "Botswana 🇧🇼" -msgstr "" - -#. js-lingui-id: yCaNfF -#: src/partner-application/data/partner-country-options.ts -msgid "Brazil 🇧🇷" -msgstr "" - -#. js-lingui-id: bmk2dj -#: src/platform/routing/static-website-routes.ts -msgid "Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models." -msgstr "" - -#. js-lingui-id: VX4eI/ -#: src/partner-application/data/partner-country-options.ts -msgid "Brunei 🇧🇳" -msgstr "" - -#. js-lingui-id: s4FVHa -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -msgid "" -"Build a CRM your\n" -"competitors *can't buy.*" -msgstr "" - -#. js-lingui-id: sbr0X/ -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Build a dashboard of pipeline by stage" -msgstr "" - -#. js-lingui-id: uetyzD -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Build a pipeline board grouped by stage" -msgstr "" - -#. js-lingui-id: 3+uH0v -#: src/platform/releases/release-notes.tsx -msgid "Build an app" -msgstr "" - -#. js-lingui-id: Utc5RF -#: src/sections/product-feature/feature-tiles.ts -msgid "Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads." -msgstr "" - -#. js-lingui-id: rdvFK9 -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Build it in an afternoon. *AI made the gap that small.*" -msgstr "" - -#. js-lingui-id: e1u+Zh -#: src/sections/menu/menu.data.ts -msgid "Build on an open platform" -msgstr "" - -#. js-lingui-id: yEKs3h -#: src/platform/releases/release-notes.tsx -msgid "Build with your favorite tools" -msgstr "" - -#. js-lingui-id: 2FDUkV -#: src/sections/home-hero/home-hero.tsx -msgid "Build your Enterprise CRM *at AI Speed*" -msgstr "" - -#. js-lingui-id: SoAKmY -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Built for speed" -msgstr "" - -#. js-lingui-id: sdItv6 -#: src/partner-application/data/partner-country-options.ts -msgid "Bulgaria 🇧🇬" -msgstr "" - -#. js-lingui-id: Lze0QH -#: src/platform/releases/release-notes.tsx -msgid "Bulk Deletion" -msgstr "" - -#. js-lingui-id: dNnRlc -#: src/partner-application/data/partner-country-options.ts -msgid "Burkina Faso 🇧🇫" -msgstr "" - -#. js-lingui-id: j8RGrG -#: src/case-studies/case-study-stories.ts -msgid "Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty" -msgstr "" - -#. js-lingui-id: jtdtLa -#: src/partner-application/data/partner-country-options.ts -msgid "Burundi 🇧🇮" -msgstr "" - -#. js-lingui-id: L40Ae7 -#: src/partner-application/partner-application-copy.ts -msgid "Calendar / booking link" -msgstr "" - -#. js-lingui-id: 6DqzR/ -#: src/platform/releases/release-notes.tsx -msgid "Calendar View for Objects" -msgstr "" - -#. js-lingui-id: 4yFkf9 -#: src/partner-application/data/partner-country-options.ts -msgid "Cambodia 🇰🇭" -msgstr "" - -#. js-lingui-id: AvRzYu -#: src/partner-application/data/partner-country-options.ts -msgid "Cameroon 🇨🇲" -msgstr "" - -#. js-lingui-id: wCALve -#: src/sections/faq/faq.data.ts -msgid "Can developers extend Twenty with code?" -msgstr "" - -#. js-lingui-id: 6mytgb -#: src/sections/faq/faq.data.ts -msgid "Can I migrate from Salesforce or HubSpot?" -msgstr "" - -#. js-lingui-id: nEOTNi -#: src/partner-application/data/partner-country-options.ts -msgid "Canada 🇨🇦" -msgstr "" - -#. js-lingui-id: hRO6uK -#: src/partner-application/data/partner-country-options.ts -msgid "Cape Verde 🇨🇻" -msgstr "" - -#. js-lingui-id: qLBo3s -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "carousel" -msgstr "" - -#. js-lingui-id: C6wh0T -#: src/sections/case-study-catalog/case-study-card.tsx -msgid "Case" -msgstr "" - -#. js-lingui-id: M1RLfx -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Catalan" -msgstr "" - -#. js-lingui-id: NUrY9o -#: src/partners-marketplace/partner-facts-list.tsx -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Categories" -msgstr "" - -#. js-lingui-id: dBApoS -#: src/partner-application/data/partner-country-options.ts -msgid "Central African Republic 🇨🇫" -msgstr "" - -#. js-lingui-id: iI3Dq9 -#: src/partner-application/data/partner-country-options.ts -msgid "Chad 🇹🇩" -msgstr "" - -#. js-lingui-id: +DEogc -#: src/sections/footer/locale-switcher.tsx -msgid "Change language" -msgstr "" - -#. js-lingui-id: 2D9CbR -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Check more add-ons" -msgstr "" - -#. js-lingui-id: 2BY3So -#: src/partner-application/data/partner-country-options.ts -msgid "Chile 🇨🇱" -msgstr "" - -#. js-lingui-id: zG6t8U -#: src/partner-application/data/partner-country-options.ts -msgid "China 🇨🇳" -msgstr "" - -#. js-lingui-id: h1IXFK -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Chinese" -msgstr "" - -#. js-lingui-id: s2oWpP -#: src/sections/footer/locale-switcher.tsx -msgid "Choose a language" -msgstr "" - -#. js-lingui-id: AZNxzv -#: src/platform/releases/release-notes.tsx -msgid "Choose a role directly when inviting a teammate to a workspace." -msgstr "" - -#. js-lingui-id: geiXTM -#: src/platform/releases/release-notes.tsx -msgid "Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need." -msgstr "" - -#. js-lingui-id: TNVfAe -#: src/platform/releases/release-notes.tsx -msgid "Choose how to display dates in any field using a universal Unicode date format that best suits your use case." -msgstr "" - -#. js-lingui-id: 3wV73y -#: src/partner-application/partner-application-copy.ts -msgid "City" -msgstr "" - -#. js-lingui-id: ZbCD7v -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Classic never dies. It just gets extended one more time." -msgstr "" - -#. js-lingui-id: u8JHrO -#: src/partners-marketplace/filter-bar.tsx -#: src/partners-marketplace/empty-state.tsx -msgid "Clear filters" -msgstr "" - -#. js-lingui-id: yz7wBu -#: src/app-preview/stage/traffic-lights.tsx -msgid "Close" -msgstr "" - -#. js-lingui-id: cu6iol -#: src/sections/pricing-salesfarce/salesfarce-wrong-choice-popup.tsx -msgid "Close dialog" -msgstr "" - -#. js-lingui-id: vcpc5o -#: src/sections/menu/menu.tsx -msgid "Close menu" -msgstr "" - -#. js-lingui-id: oLsrmd -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -msgid "Close pricing window" -msgstr "" - -#. js-lingui-id: R7zx6E -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "cloud" -msgstr "" - -#. js-lingui-id: L/LPQZ -#: src/sections/faq/faq.data.ts -msgid "Cloud Pro is $9/user/month (yearly). Organization is $19/user/month and unlocks SSO and row-level permissions for teams that need finer access control." -msgstr "" - -#. js-lingui-id: WYgF8M -#: src/platform/routing/static-website-routes.ts -msgid "Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions." -msgstr "" - -#. js-lingui-id: 1YncLF -#: src/sections/testimonials/testimonials.data.ts -msgid "Co-founder at NetZero" -msgstr "" - -#. js-lingui-id: 4QGkvo -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "co-founder of NetZero" -msgstr "" - -#. js-lingui-id: vWaYWP -#: src/case-studies/case-study-catalog.ts -msgid "Co-founder, NetZero" -msgstr "" - -#. js-lingui-id: dcLsG5 -#: src/partner-application/data/partner-country-options.ts -msgid "Colombia 🇨🇴" -msgstr "" - -#. js-lingui-id: b5bnuN -#: src/sections/product-feature/feature-tiles.ts -msgid "Column-to-field mapping (including relations)" -msgstr "" - -#. js-lingui-id: ofoEsM -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Coming soon!" -msgstr "" - -#. js-lingui-id: KGD9Kt -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Commercial license (no AGPL obligations)" -msgstr "" - -#. js-lingui-id: OnPROL -#: src/partner-application/partner-application-copy.ts -msgid "Commercials" -msgstr "" - -#. js-lingui-id: chL5IG -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/menu/menu-social.tsx -msgid "Community" -msgstr "" - -#. js-lingui-id: 8CLnho -#: src/sections/pricing-plans/plans-data.ts -msgid "Community support" -msgstr "" - -#. js-lingui-id: RxpseA -#: src/partner-application/data/partner-country-options.ts -msgid "Comoros 🇰🇲" -msgstr "" - -#. js-lingui-id: SHjhDC -#: src/partner-application/partner-application-copy.ts -msgid "Company or brand *" -msgstr "" - -#. js-lingui-id: Fkb+LW -#: src/sections/three-cards/three-cards.tsx -msgid "Compose your CRM and internal apps with a single extensibility toolkit." -msgstr "" - -#. js-lingui-id: kD7ZGH -#: src/sections/stepper/stepper.data.ts -msgid "Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation." -msgstr "" - -#. js-lingui-id: 2DQw7/ -#: src/partner-application/data/partner-country-options.ts -msgid "Congo 🇨🇬" -msgstr "" - -#. js-lingui-id: iSLIjg -#: src/sections/footer/footer.data.ts -msgid "Connect" -msgstr "" - -#. js-lingui-id: 90KBr0 -#: src/sections/product-feature/feature-tiles.ts -msgid "Connect Google or Microsoft accounts" -msgstr "" - -#. js-lingui-id: xgrBCK -#: src/sections/product-feature/feature-tiles.ts -msgid "Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically." -msgstr "" - -#. js-lingui-id: dGwMkb -#: src/platform/releases/release-notes.tsx -msgid "Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team." -msgstr "" - -#. js-lingui-id: MVrQxI -#: src/case-studies/case-study-catalog.ts -msgid "Connected via API" -msgstr "" - -#. js-lingui-id: cfAG43 -#: src/case-studies/case-study-catalog.ts -msgid "Consulting" -msgstr "" - -#. js-lingui-id: GsUBlG -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Contact {partnerName}" -msgstr "" - -#. js-lingui-id: Oii3vg -#: src/sections/product-feature/feature-tiles.ts -msgid "Contacts & Companies" -msgstr "" - -#. js-lingui-id: 24qVhV -#: src/sections/product-feature/feature-tiles.ts -msgid "Context lives with the record." -msgstr "" - -#. js-lingui-id: mXovG/ -#: src/sections/stepper/stepper.data.ts -msgid "Continue iteration *without friction*" -msgstr "" - -#. js-lingui-id: LqyWsJ -#: src/platform/releases/release-notes.tsx -msgid "Contributors now have their very own hall of fame." -msgstr "" - -#. js-lingui-id: qVH+kL -#: src/platform/releases/release-notes.tsx -msgid "Contributors page" -msgstr "" - -#. js-lingui-id: +Uepfb -#: src/case-studies/case-study-stories.ts -msgid "Control" -msgstr "" - -#. js-lingui-id: GplbCP -#: src/case-studies/case-study-stories.ts -msgid "Control without *the overhead*" -msgstr "" - -#. js-lingui-id: wH1xmY -#: src/sections/three-cards/three-cards.data.ts -msgid "Control without drag" -msgstr "" - -#. js-lingui-id: Bj7igG -#: src/case-studies/case-study-stories.ts -msgid "Control without the overhead" -msgstr "" - -#. js-lingui-id: PiH3UR -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copied!" -msgstr "" - -#. js-lingui-id: he3ygx -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy" -msgstr "" - -#. js-lingui-id: 7qTWwB -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy the enterprise key above." -msgstr "" - -#. js-lingui-id: PXnj76 -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy this key and paste it into your Twenty self-hosted instance settings." -msgstr "" - -#. js-lingui-id: FapWIq -#: src/sections/product-feature/product-feature.tsx -msgid "Core Features" -msgstr "" - -#. js-lingui-id: Al/blj -#: src/partner-application/data/partner-country-options.ts -msgid "Costa Rica 🇨🇷" -msgstr "" - -#. js-lingui-id: 1B8JTc -#: src/case-studies/case-study-stories.ts -msgid "Costs down more than *90%*" -msgstr "" - -#. js-lingui-id: cRA2/z -#: src/partner-application/partner-application-copy.ts -msgid "Country *" -msgstr "" - -#. js-lingui-id: kCu+Rq -#: src/platform/releases/release-notes.tsx -msgid "Create a Kanban view on any object and streamline processes like recruitment or onboarding." -msgstr "" - -#. js-lingui-id: Xn2Nlq -#: src/sections/stepper/product-stepper-data.ts -msgid "Create a workflow" -msgstr "" - -#. js-lingui-id: +kFrvb -#: src/platform/releases/release-notes.tsx -msgid "Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs." -msgstr "" - -#. js-lingui-id: t9znrt -#: src/platform/releases/release-notes.tsx -msgid "Create and organize sidebar items more easily with a cleaner navigation setup." -msgstr "" - -#. js-lingui-id: B9nLrl -#: src/sections/menu/menu.data.ts -msgid "Create apps on Twenty" -msgstr "" - -#. js-lingui-id: yAL7FY -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Create custom apps" -msgstr "" - -#. js-lingui-id: 20ZdFp -#: src/platform/releases/release-notes.tsx -msgid "Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics." -msgstr "" - -#. js-lingui-id: YxktRb -#: src/platform/releases/release-notes.tsx -msgid "Create fields and edit field widgets more directly from record pages." -msgstr "" - -#. js-lingui-id: RRfcjH -#: src/platform/releases/release-notes.tsx -msgid "Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities." -msgstr "" - -#. js-lingui-id: qCRCtk -#: src/platform/releases/release-notes.tsx -msgid "Create more flexible relationships between objects, including more advanced many-to-many setups." -msgstr "" - -#. js-lingui-id: oS1RiS -#: src/sections/product-feature/feature-tiles.ts -msgid "Create tasks from records" -msgstr "" - -#. js-lingui-id: D3S5+x -#: src/sections/product-feature/feature-tiles.ts -msgid "Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context." -msgstr "" - -#. js-lingui-id: egTba/ -#: src/platform/releases/release-notes.tsx -msgid "Created By" -msgstr "" - -#. js-lingui-id: ppNnWO -#: src/platform/releases/release-notes.tsx -msgid "Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields." -msgstr "" - -#. js-lingui-id: NLgmM4 -#: src/partner-application/data/partner-scope-options.ts -msgid "CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection" -msgstr "" - -#. js-lingui-id: Y44Xsf -#: src/case-studies/case-study-stories.ts -msgid "CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again." -msgstr "" - -#. js-lingui-id: wDasLa -#: src/sections/three-cards/three-cards.data.ts -msgid "CRM Engineer" -msgstr "" - -#. js-lingui-id: DqkzNV -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "CRM Engineer, AC&T Education Migration" -msgstr "" - -#. js-lingui-id: b7vNti -#: src/sections/why-twenty-hero/why-twenty-hero.tsx -msgid "CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy." -msgstr "" - -#. js-lingui-id: ntHvtU -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "CRM was a ledger. *AI turned it into an operating system.*" -msgstr "" - -#. js-lingui-id: OACAVp -#: src/partner-application/data/partner-country-options.ts -msgid "Croatia 🇭🇷" -msgstr "" - -#. js-lingui-id: I6FFSA -#: src/sections/product-feature/feature-tiles.ts -msgid "CSV export anytime" -msgstr "" - -#. js-lingui-id: 8RWevB -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "CSV import & export" -msgstr "" - -#. js-lingui-id: s+QiQi -#: src/sections/product-feature/feature-tiles.ts -msgid "CSV import flow" -msgstr "" - -#. js-lingui-id: zyTj4q -#: src/platform/releases/release-notes.tsx -msgid "CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports." -msgstr "" - -#. js-lingui-id: O2UtEV -#: src/partner-application/data/partner-country-options.ts -msgid "Cuba 🇨🇺" -msgstr "" - -#. js-lingui-id: auudI+ -#: src/platform/releases/release-notes.tsx -msgid "Currency Field" -msgstr "" - -#. js-lingui-id: lh6aPn -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom AI models" -msgstr "" - -#. js-lingui-id: OaTurC -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom apps" -msgstr "" - -#. js-lingui-id: TcUCTv -#: src/partner-application/data/partner-scope-options.ts -msgid "Custom Apps · Scripts · AI/agent integrations" -msgstr "" - -#. js-lingui-id: onPW5H -#: src/platform/releases/release-notes.tsx -msgid "Custom date formats" -msgstr "" - -#. js-lingui-id: yBSEtR -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom deal stages for your process" -msgstr "" - -#. js-lingui-id: L+b7SB -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality." -msgstr "" - -#. js-lingui-id: DUnke3 -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Custom Development" -msgstr "" - -#. js-lingui-id: GAD3Dx -#: src/sections/pricing-plans/plans-data.ts -msgid "Custom domain" -msgstr "" - -#. js-lingui-id: Vz1Vq2 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom domain (crm.yourco.com)" -msgstr "" - -#. js-lingui-id: oPwQt4 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom fields" -msgstr "" - -#. js-lingui-id: U1RB/7 -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom fields and relationships" -msgstr "" - -#. js-lingui-id: WGKb6T -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom fields, relationships, and a unified timeline for every contact and company in your workspace." -msgstr "" - -#. js-lingui-id: prIqWa -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom layout" -msgstr "" - -#. js-lingui-id: RuYs9T -#: src/platform/releases/release-notes.tsx -msgid "Custom layouts" -msgstr "" - -#. js-lingui-id: 8skTDV -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom objects" -msgstr "" - -#. js-lingui-id: y5pLQH -#: src/platform/releases/release-notes.tsx -msgid "Custom sidebar" -msgstr "" - -#. js-lingui-id: AbyZbl -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom views" -msgstr "" - -#. js-lingui-id: 5xK1jE -#: src/sections/helped/helped-scene.tsx -#: src/sections/case-study-catalog/case-study-catalog-grid.tsx -msgid "Customer stories" -msgstr "" - -#. js-lingui-id: YjXLAQ -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Customer Stories" -msgstr "" - -#. js-lingui-id: BavWCk -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Customer stories preview" -msgstr "" - -#. js-lingui-id: 0fgCyk -#: src/sections/case-study-detail/case-study-hero.tsx -msgid "Customer story" -msgstr "" - -#. js-lingui-id: zKLqOg -#: src/app/[locale]/(site)/customers/[slug]/page.tsx -msgid "Customer story not found — Twenty" -msgstr "" - -#. js-lingui-id: NihQNk -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Customers" -msgstr "" - -#. js-lingui-id: qqLY+j -#: src/sections/stepper/product-stepper-content.tsx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Customization" -msgstr "" - -#. js-lingui-id: GRfLAg -#: src/case-studies/case-study-catalog.ts -msgid "Customizations" -msgstr "" - -#. js-lingui-id: dy0yuR -#: src/platform/releases/release-notes.tsx -msgid "Customize your sub-domain" -msgstr "" - -#. js-lingui-id: Pj5fGG -#: src/partner-application/data/partner-country-options.ts -msgid "Cyprus 🇨🇾" -msgstr "" - -#. js-lingui-id: w9VTXG -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Czech" -msgstr "" - -#. js-lingui-id: xkuHM6 -#: src/partner-application/data/partner-country-options.ts -msgid "Czech Republic 🇨🇿" -msgstr "" - -#. js-lingui-id: 4RLD4p -#: src/case-studies/case-study-catalog.ts -msgid "Daily messages" -msgstr "" - -#. js-lingui-id: Fo2vDn -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Danish" -msgstr "" - -#. js-lingui-id: aebTao -#: src/platform/releases/release-notes.tsx -msgid "Dashboards in Labs (Beta)" -msgstr "" - -#. js-lingui-id: V0kvgB -#: src/sections/product-feature/feature-tiles.ts -msgid "Data import" -msgstr "" - -#. js-lingui-id: 5cNMFz -#: src/sections/stepper/product-stepper-data.ts -msgid "Data model" -msgstr "" - -#. js-lingui-id: ZEsvS2 -#: src/platform/releases/release-notes.tsx -msgid "Data Model Diagram" -msgstr "" - -#. js-lingui-id: iq2WTm -#: src/partner-application/data/partner-scope-options.ts -msgid "Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations" -msgstr "" - -#. js-lingui-id: dSuMNg -#: src/platform/releases/release-notes.tsx -msgid "Datetime Field" -msgstr "" - -#. js-lingui-id: /TlpVf -#: src/sections/product-feature/feature-tiles.ts -msgid "Deals that move themselves." -msgstr "" - -#. js-lingui-id: H1UtjM -#: src/partner-application/data/partner-country-options.ts -msgid "Denmark 🇩🇰" -msgstr "" - -#. js-lingui-id: tqbpyT -#: src/platform/releases/release-notes.tsx -msgid "Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting." -msgstr "" - -#. js-lingui-id: X5B6sd -#: src/sections/helped/helped-scene.tsx -msgid "Dev teams power company-wide *change with Twenty*" -msgstr "" - -#. js-lingui-id: n+SX4g -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Developers" -msgstr "" - -#. js-lingui-id: 5atXgh -#: src/platform/releases/release-notes.tsx -msgid "Developers can now take advantage of the new array field type to store non-predefined values." -msgstr "" - -#. js-lingui-id: canH5K -#: src/platform/releases/release-notes.tsx -msgid "Developers can now use webhooks to synchronize customer data updates in real-time across applications." -msgstr "" - -#. js-lingui-id: ohFj56 -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Differentiation now *lives in the code you own.*" -msgstr "" - -#. js-lingui-id: Wuqvfz -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "Director of Digital and Information, Elevate Consulting" -msgstr "" - -#. js-lingui-id: gW1L7t -#: src/case-studies/case-study-stories.ts -msgid "Director, W3villa Technologies, Partner" -msgstr "" - -#. js-lingui-id: 30qcNY -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "Discord (opens in new tab)" -msgstr "" - -#. js-lingui-id: old0Lj -#: src/sections/releases-hero/releases-hero.tsx -msgid "Discover the newest features and improvements in Twenty, the #1 Open Source CRM." -msgstr "" - -#. js-lingui-id: W+b/DF -#: src/sections/menu/menu.data.ts -msgid "Discover what's new" -msgstr "" - -#. js-lingui-id: rHLwDO -#: src/partner-application/data/partner-country-options.ts -msgid "Djibouti 🇩🇯" -msgstr "" - -#. js-lingui-id: Zjjbne -#: src/sections/faq/faq.data.ts -msgid "Do I need a developer to customize Twenty?" -msgstr "" - -#. js-lingui-id: Zx22Ih -#: src/sections/faq/faq.data.ts -msgid "Does Twenty work with Claude, ChatGPT, and Cursor?" -msgstr "" - -#. js-lingui-id: bMDnQR -#: src/partner-application/data/partner-country-options.ts -msgid "Dominica 🇩🇲" -msgstr "" - -#. js-lingui-id: ufcRA6 -#: src/partner-application/data/partner-country-options.ts -msgid "Dominican Republic 🇩🇴" -msgstr "" - -#. js-lingui-id: pOLPPB -#: src/sections/stepper/stepper.data.ts -msgid "Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling." -msgstr "" - -#. js-lingui-id: HDR0en -#: src/partner-application/data/partner-country-options.ts -msgid "DR Congo 🇨🇩" -msgstr "" - -#. js-lingui-id: mzedFr -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Draft a workflow for an email sequence" -msgstr "" - -#. js-lingui-id: q7M3jo -#: src/platform/releases/release-notes.tsx -msgid "Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works." -msgstr "" - -#. js-lingui-id: fPma12 -#: src/sections/product-feature/feature-tiles.ts -msgid "Drag-and-drop deals between stages" -msgstr "" - -#. js-lingui-id: KIjvtr -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Dutch" -msgstr "" - -#. js-lingui-id: 6r6pDf -#: src/partner-application/partner-application-copy.ts -msgid "e.g. React, Postgres, n8n…" -msgstr "" - -#. js-lingui-id: a35sCN -#: src/platform/releases/release-notes.tsx -msgid "Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain." -msgstr "" - -#. js-lingui-id: s+5p5k -#: src/platform/releases/release-notes.tsx -msgid "Easier field editing" -msgstr "" - -#. js-lingui-id: nKXMzJ -#: src/platform/releases/release-notes.tsx -msgid "Easier layouts" -msgstr "" - -#. js-lingui-id: hEtClO -#: src/partner-application/data/partner-country-options.ts -msgid "Ecuador 🇪🇨" -msgstr "" - -#. js-lingui-id: 4CJ4xV -#: src/case-studies/case-study-catalog.ts -msgid "EdTech" -msgstr "" - -#. js-lingui-id: aqxYLv -#: src/case-studies/case-study-catalog.ts -msgid "Education" -msgstr "" - -#. js-lingui-id: OAdXUT -#: src/partner-application/data/partner-country-options.ts -msgid "Egypt 🇪🇬" -msgstr "" - -#. js-lingui-id: 2xK+An -#: src/partner-application/data/partner-country-options.ts -msgid "El Salvador 🇸🇻" -msgstr "" - -#. js-lingui-id: 1wTjWx -#: src/case-studies/case-study-stories.ts -msgid "Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth." -msgstr "" - -#. js-lingui-id: 2THY70 -#: src/case-studies/case-study-catalog.ts -msgid "Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data." -msgstr "" - -#. js-lingui-id: wiTeYI -#: src/case-studies/case-study-stories.ts -msgid "Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs." -msgstr "" - -#. js-lingui-id: FNyrb0 -#: src/sections/product-feature/feature-tiles.ts -msgid "Email & Calendar" -msgstr "" - -#. js-lingui-id: jTgK6B -#: src/platform/releases/release-notes.tsx -msgid "Email and calendar Blocklist" -msgstr "" - -#. js-lingui-id: AoN898 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Email and Chat" -msgstr "" - -#. js-lingui-id: rc8HEz -#: src/platform/releases/release-notes.tsx -msgid "Email replies" -msgstr "" - -#. js-lingui-id: ObCvfI -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Email sharing" -msgstr "" - -#. js-lingui-id: 7o9obN -#: src/platform/releases/release-notes.tsx -msgid "Email thread widgets and an inline reply composer make it easier to work directly from messaging records." -msgstr "" - -#. js-lingui-id: hfqiVr -#: src/sections/product-feature/feature-tiles.ts -msgid "Email/calendar activity on each record" -msgstr "" - -#. js-lingui-id: XGd8Wo -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Emails & Calendar" -msgstr "" - -#. js-lingui-id: o4/9l1 -#: src/sections/product-feature/feature-tiles.ts -msgid "Emails and events linked to CRM records" -msgstr "" - -#. js-lingui-id: QOINDn -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "empty" -msgstr "" - -#. js-lingui-id: ZxDrUL -#: src/platform/releases/release-notes.tsx -msgid "Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!" -msgstr "" - -#. js-lingui-id: jkaFcU -#: src/platform/releases/release-notes.tsx -msgid "Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in." -msgstr "" - -#. js-lingui-id: Qpn/bX -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Encrypt your data" -msgstr "" - -#. js-lingui-id: Iy8Gze -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Encryption key rotation" -msgstr "" - -#. js-lingui-id: lYGfRP -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "English" -msgstr "" - -#. js-lingui-id: pNNVhg -#: src/platform/releases/release-notes.tsx -msgid "Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication." -msgstr "" - -#. js-lingui-id: kZ17+i -#: src/platform/releases/release-notes.tsx -msgid "Enhance your data handling capabilities with the addition of four new field types:" -msgstr "" - -#. js-lingui-id: CVqFAV -#: src/platform/releases/release-notes.tsx -msgid "Enhanced Kanban Board" -msgstr "" - -#. js-lingui-id: LKTMHa -#: src/platform/releases/release-notes.tsx -msgid "Enhanced One-to-Many Relations Editing" -msgstr "" - -#. js-lingui-id: ovz6sZ -#: src/platform/releases/release-notes.tsx -msgid "Enhanced Timeline" -msgstr "" - -#. js-lingui-id: Ijh+h+ -#: src/sections/stepper/stepper.data.ts -msgid "Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins." -msgstr "" - -#. js-lingui-id: xoqD/n -#: src/partner-application/partner-application-copy.ts -msgid "Enter a valid email address." -msgstr "" - -#. js-lingui-id: /OVUD6 -#: src/partner-application/partner-application-copy.ts -msgid "Enter a valid URL (starting with http:// or https://)." -msgstr "" - -#. js-lingui-id: 87BcPj -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Enterprise *activation*" -msgstr "" - -#. js-lingui-id: NTskGY -#: src/platform/routing/static-website-routes.ts -msgid "Enterprise Activation | Twenty" -msgstr "" - -#. js-lingui-id: 3dQ6zJ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Environments" -msgstr "" - -#. js-lingui-id: c0nqfC -#: src/partner-application/data/partner-country-options.ts -msgid "Equatorial Guinea 🇬🇶" -msgstr "" - -#. js-lingui-id: 4DIpFY -#: src/partner-application/data/partner-country-options.ts -msgid "Eritrea 🇪🇷" -msgstr "" - -#. js-lingui-id: JIhNLR -#: src/partner-application/data/partner-country-options.ts -msgid "Estonia 🇪🇪" -msgstr "" - -#. js-lingui-id: 8yXuJ9 -#: src/partner-application/data/partner-country-options.ts -msgid "Eswatini 🇸🇿" -msgstr "" - -#. js-lingui-id: rktGGp -#: src/partner-application/data/partner-country-options.ts -msgid "Ethiopia 🇪🇹" -msgstr "" - -#. js-lingui-id: rQqP1P -#: src/partners-marketplace/served-geo-labels.ts -msgid "Europe" -msgstr "" - -#. js-lingui-id: IhKZhp -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Even the training material is a feature worth celebrating." -msgstr "" - -#. js-lingui-id: sQP1sF -#: src/platform/routing/static-website-routes.ts -msgid "Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most." -msgstr "" - -#. js-lingui-id: rkZTD7 -#: src/sections/product-feature/feature-tiles.ts -msgid "Every thread, on the right record." -msgstr "" - -#. js-lingui-id: kz/8m8 -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Everything in Pro" -msgstr "" - -#. js-lingui-id: zoNk7e -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Everything updates in real time, with AI chat always ready to help you move faster." -msgstr "" - -#. js-lingui-id: /g9UKY -#: src/sections/product-feature/product-feature.tsx -msgid "Everything you need, *out of the box*" -msgstr "" - -#. js-lingui-id: 2NGXKo -#: src/platform/releases/release-notes.tsx -msgid "Expanded support for 30+ languages, so users can navigate and use the software in their preferred language." -msgstr "" - -#. js-lingui-id: 14xdUh -#: src/platform/releases/release-notes.tsx -msgid "Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization." -msgstr "" - -#. js-lingui-id: 57gG1f -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Experience enterprise-grade granularity, starting with an 11th permission." -msgstr "" - -#. js-lingui-id: uZRQi+ -#: src/partner-application/partner-application-copy.ts -msgid "Expertise & experience" -msgstr "" - -#. js-lingui-id: JTM5zS -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Explore customer stories" -msgstr "" - -#. js-lingui-id: weFouS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Extended run!" -msgstr "" - -#. js-lingui-id: tX4pRm -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Failed to activate enterprise key. Please try again." -msgstr "" - -#. js-lingui-id: akLvep -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Familiar, modern interface" -msgstr "" - -#. js-lingui-id: gKNP7S -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Farsi" -msgstr "" - -#. js-lingui-id: abO45l -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Fast path to action" -msgstr "" - -#. js-lingui-id: idFRAo -#: src/platform/releases/release-notes.tsx -msgid "Faster field setup" -msgstr "" - -#. js-lingui-id: 3qy0z4 -#: src/platform/releases/release-notes.tsx -msgid "Favorites now live in the navigation menu, making the sidebar easier to organize and customize." -msgstr "" - -#. js-lingui-id: JrTb6F -#: src/platform/releases/release-notes.tsx -msgid "Favorites Views and Favorites Folders" -msgstr "" - -#. js-lingui-id: +LREeu -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "feature" -msgstr "" - -#. js-lingui-id: hXRm6J -#: src/platform/releases/release-notes.tsx -msgid "Field Level Permission" -msgstr "" - -#. js-lingui-id: 3Y3//3 -#: src/platform/releases/release-notes.tsx -msgid "Field widgets" -msgstr "" - -#. js-lingui-id: QDxnW/ -#: src/platform/releases/release-notes.tsx -msgid "Field widgets are easier to configure directly from the page where you use them." -msgstr "" - -#. js-lingui-id: 5SV9rS -#: src/platform/releases/release-notes.tsx -msgid "Field widgets now support more relation types, so custom layouts work better across more objects." -msgstr "" - -#. js-lingui-id: e6BgMV -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Field-level permissions" -msgstr "" - -#. js-lingui-id: z+q1Th -#: src/partner-application/data/partner-country-options.ts -msgid "Fiji 🇫🇯" -msgstr "" - -#. js-lingui-id: sER+bs -#: src/sections/product-feature/feature-tiles.ts -msgid "Files" -msgstr "" - -#. js-lingui-id: jxbpA9 -#: src/platform/releases/release-notes.tsx -msgid "Files in records" -msgstr "" - -#. js-lingui-id: 1t0xRH -#: src/platform/releases/release-notes.tsx -msgid "Filter by Multi-Select" -msgstr "" - -#. js-lingui-id: bOidm7 -#: src/partners-marketplace/filter-bar.tsx -msgid "Filter partners" -msgstr "" - -#. js-lingui-id: kUUNrw -#: src/platform/releases/release-notes.tsx -msgid "Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company." -msgstr "" - -#. js-lingui-id: iabLgo -#: src/sections/product-feature/feature-tiles.ts -msgid "Filtered metrics from any object" -msgstr "" - -#. js-lingui-id: sRUAXp -#: src/platform/routing/static-website-routes.ts -msgid "Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us." -msgstr "" - -#. js-lingui-id: TJ7HQl -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/partner-hero/partner-hero.tsx -msgid "Find a partner" -msgstr "" - -#. js-lingui-id: MD032e -#: src/sections/menu/menu.data.ts -msgid "Find a Twenty partner" -msgstr "" - -#. js-lingui-id: S6CEQ9 -#: src/platform/routing/static-website-routes.ts -msgid "Find a Twenty Partner — Open Source CRM Marketplace" -msgstr "" - -#. js-lingui-id: wHyJkT -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -msgid "Find the right partner to implement, customize, and tailor Twenty to your team." -msgstr "" - -#. js-lingui-id: 5asqas -#: src/partners-marketplace/marketplace-header.tsx -msgid "Find your *Twenty partner*" -msgstr "" - -#. js-lingui-id: 9V48qi -#: src/partner-application/data/partner-country-options.ts -msgid "Finland 🇫🇮" -msgstr "" - -#. js-lingui-id: USZ2N6 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Finnish" -msgstr "" - -#. js-lingui-id: PHM5wp -#: src/case-studies/case-study-stories.ts -msgid "Flexibility" -msgstr "" - -#. js-lingui-id: YsFkku -#: src/platform/releases/release-notes.tsx -msgid "Flexible relations" -msgstr "" - -#. js-lingui-id: HBJ0P5 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"Flow\n" -"orchestration" -msgstr "" - -#. js-lingui-id: obrJBN -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Fly through your workspace with shortcuts and short load times." -msgstr "" - -#. js-lingui-id: HjFq2b -#: src/case-studies/case-study-stories.ts -msgid "Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute." -msgstr "" - -#. js-lingui-id: mjIRMF -#: src/case-studies/case-study-stories.ts -msgid "Focus on the use case, not the *plumbing*" -msgstr "" - -#. js-lingui-id: P5E+kT -#: src/case-studies/case-study-stories.ts -msgid "Focus on the use case, not the plumbing" -msgstr "" - -#. js-lingui-id: wdVyxi -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Folder/Label import" -msgstr "" - -#. js-lingui-id: qwJuVW -#: src/sections/footer/footer-nav.tsx -msgid "Footer" -msgstr "" - -#. js-lingui-id: CKQ0za -#: src/case-studies/case-study-stories.ts -msgid "For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation." -msgstr "" - -#. js-lingui-id: yAJC9c -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it." -msgstr "" - -#. js-lingui-id: UCoxP5 -#: src/sections/testimonials/partner-testimonials.data.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "Founder, Nine Dots Ventures" -msgstr "" - -#. js-lingui-id: IPaRlc -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Founder, Wintactix" -msgstr "" - -#. js-lingui-id: 671GY5 -#: src/partner-application/data/partner-country-options.ts -msgid "France 🇫🇷" -msgstr "" - -#. js-lingui-id: tUgSXd -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Free for you!" -msgstr "" - -#. js-lingui-id: nLC6tu -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "French" -msgstr "" - -#. js-lingui-id: weRlb1 -#: src/partners-marketplace/partner-money-row.tsx -msgid "from {minBudget}" -msgstr "" - -#. js-lingui-id: Iuxc00 -#: src/sections/product-feature/feature-tiles.ts -msgid "From CSV to CRM in minutes." -msgstr "" - -#. js-lingui-id: Mxpask -#: src/case-studies/case-study-stories.ts -msgid "From documents to *open APIs*" -msgstr "" - -#. js-lingui-id: emeKZ7 -#: src/case-studies/case-study-stories.ts -msgid "From documents to open APIs" -msgstr "" - -#. js-lingui-id: 2CtZ6T -#: src/case-studies/case-study-stories.ts -msgid "" -"From Salesforce to\n" -"*self-hosted Twenty*" -msgstr "" - -#. js-lingui-id: kl+hEJ -#: src/case-studies/case-study-catalog.ts -msgid "From Salesforce to self-hosted Twenty" -msgstr "" - -#. js-lingui-id: syU/BD -#: src/case-studies/case-study-stories.ts -msgid "From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners" -msgstr "" - -#. js-lingui-id: UfoVki -#: src/case-studies/case-study-stories.ts -msgid "From simple to *advanced*" -msgstr "" - -#. js-lingui-id: Lf7cb3 -#: src/case-studies/case-study-stories.ts -msgid "From simple to advanced" -msgstr "" - -#. js-lingui-id: m1I5TY -#: src/sections/product-feature/feature-tiles.ts -msgid "Full communication history in one place" -msgstr "" - -#. js-lingui-id: wXgKOm -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Full customization" -msgstr "" - -#. js-lingui-id: YZ7Q3Z -#: src/case-studies/case-study-catalog.ts -msgid "Full ownership" -msgstr "" - -#. js-lingui-id: hdxwWi -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Fully customizable" -msgstr "" - -#. js-lingui-id: //hrfs -#: src/partner-application/data/partner-country-options.ts -msgid "Gabon 🇬🇦" -msgstr "" - -#. js-lingui-id: yau9J6 -#: src/partner-application/data/partner-country-options.ts -msgid "Gambia 🇬🇲" -msgstr "" - -#. js-lingui-id: S84RWl -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Generate tasks for my top 10 accounts" -msgstr "" - -#. js-lingui-id: GOmD9p -#: src/partner-application/data/partner-country-options.ts -msgid "Georgia 🇬🇪" -msgstr "" - -#. js-lingui-id: DDcvSo -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "German" -msgstr "" - -#. js-lingui-id: XcPIuI -#: src/partner-application/data/partner-country-options.ts -msgid "Germany 🇩🇪" -msgstr "" - -#. js-lingui-id: ZDIydz -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -#: src/sections/product-hero/product-hero.tsx -#: src/sections/menu/menu.tsx -#: src/sections/menu/menu.tsx -#: src/sections/home-hero/home-hero.tsx -#: src/sections/footer/footer.data.ts -#: src/sections/faq/faq.tsx -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "Get started" -msgstr "" - -#. js-lingui-id: xyKSqi -#: src/partner-application/data/partner-country-options.ts -msgid "Ghana 🇬🇭" -msgstr "" - -#. js-lingui-id: 3QRTgQ -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "GitHub (opens in new tab)" -msgstr "" - -#. js-lingui-id: wuH0g5 -#: src/platform/releases/release-notes.tsx -msgid "Gmail integration" -msgstr "" - -#. js-lingui-id: n8waaJ -#: src/sections/stepper/product-stepper-content.tsx -msgid "Go the extra mile *with no-code*" -msgstr "" - -#. js-lingui-id: Ay/vbT -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Good choice!" -msgstr "" - -#. js-lingui-id: opD7oA -#: src/platform/releases/release-notes.tsx -msgid "Google Calendar Integration" -msgstr "" - -#. js-lingui-id: Zh0acB -#: src/partner-application/partner-application-copy.ts -msgid "Grab 30 minutes so we can get to know your team." -msgstr "" - -#. js-lingui-id: 1W3PAd -#: src/platform/releases/release-notes.tsx -msgid "Granular Email Folder Sync" -msgstr "" - -#. js-lingui-id: +tDN2S -#: src/partner-application/data/partner-country-options.ts -msgid "Greece 🇬🇷" -msgstr "" - -#. js-lingui-id: CZXzs4 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Greek" -msgstr "" - -#. js-lingui-id: DDgHcm -#: src/partner-application/data/partner-country-options.ts -msgid "Grenada 🇬🇩" -msgstr "" - -#. js-lingui-id: MCLWq4 -#: src/sections/helped/helped.data.ts -msgid "Grow with a flexible foundation" -msgstr "" - -#. js-lingui-id: M/8CC1 -#: src/partner-application/data/partner-country-options.ts -msgid "Guatemala 🇬🇹" -msgstr "" - -#. js-lingui-id: UZbq7J -#: src/partner-application/data/partner-country-options.ts -msgid "Guinea 🇬🇳" -msgstr "" - -#. js-lingui-id: vtpxPx -#: src/partner-application/data/partner-country-options.ts -msgid "Guinea-Bissau 🇬🇼" -msgstr "" - -#. js-lingui-id: GT8Ua2 -#: src/partner-application/data/partner-country-options.ts -msgid "Guyana 🇬🇾" -msgstr "" - -#. js-lingui-id: 5BLiJj -#: src/partner-application/data/partner-country-options.ts -msgid "Haiti 🇭🇹" -msgstr "" - -#. js-lingui-id: Xf5EJg -#: src/sections/footer/footer.data.ts -msgid "Halftone generator" -msgstr "" - -#. js-lingui-id: DHC85F -#: src/platform/routing/static-website-routes.ts -msgid "Halftone Generator | Twenty" -msgstr "" - -#. js-lingui-id: c3XJ18 -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -#: src/sections/footer/footer.data.ts -msgid "Help" -msgstr "" - -#. js-lingui-id: CRzGla -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Help center" -msgstr "" - -#. js-lingui-id: LiWOgh -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Hey, I'm interested in meeting. Here's my project:" -msgstr "" - -#. js-lingui-id: EhWatX -#: src/app-preview/terminal/diff/diff-pill.tsx -msgid "Hide changes" -msgstr "" - -#. js-lingui-id: tGjibo -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Hindi" -msgstr "" - -#. js-lingui-id: qfSbUb -#: src/case-studies/case-study-stories.ts -msgid "His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix." -msgstr "" - -#. js-lingui-id: i0qMbr -#: src/sections/menu/menu.tsx -#: src/sections/footer/footer.data.ts -msgid "Home" -msgstr "" - -#. js-lingui-id: CtU7yU -#: src/case-studies/case-study-stories.ts -msgid "Homeseller" -msgstr "" - -#. js-lingui-id: KYnPnU -#: src/case-studies/case-study-stories.ts -msgid "Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together." -msgstr "" - -#. js-lingui-id: v6cmMq -#: src/case-studies/case-study-stories.ts -msgid "Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time." -msgstr "" - -#. js-lingui-id: xaIV9m -#: src/case-studies/case-study-stories.ts -msgid "Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty" -msgstr "" - -#. js-lingui-id: zbfmqm -#: src/partner-application/data/partner-country-options.ts -msgid "Honduras 🇭🇳" -msgstr "" - -#. js-lingui-id: mqX9AX -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Hosting & Infrastructure" -msgstr "" - -#. js-lingui-id: SHZNBm -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Hourly" -msgstr "" - -#. js-lingui-id: Ivq5+7 -#: src/partner-application/partner-application-copy.ts -msgid "Hourly rate" -msgstr "" - -#. js-lingui-id: XnFo3G -#: src/case-studies/case-study-stories.ts -msgid "How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership." -msgstr "" - -#. js-lingui-id: PYi0f6 -#: src/case-studies/case-study-stories.ts -msgid "How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership." -msgstr "" - -#. js-lingui-id: +MLOVo -#: src/case-studies/case-study-stories.ts -msgid "How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack." -msgstr "" - -#. js-lingui-id: OIwpKt -#: src/sections/faq/faq.data.ts -msgid "How long does it take to get started?" -msgstr "" - -#. js-lingui-id: iRzy9e -#: src/case-studies/case-study-stories.ts -msgid "How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows." -msgstr "" - -#. js-lingui-id: NZYA4S -#: src/case-studies/case-study-stories.ts -msgid "How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day." -msgstr "" - -#. js-lingui-id: 5sWcC0 -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "" -"How teams\n" -"*built with Twenty*" -msgstr "" - -#. js-lingui-id: Z3Cabh -#: src/platform/routing/static-website-routes.ts -msgid "How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy." -msgstr "" - -#. js-lingui-id: URQPvK -#: src/case-studies/case-study-stories.ts -msgid "How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone." -msgstr "" - -#. js-lingui-id: htrFcw -#: src/partner-application/data/partner-country-options.ts -msgid "Hungary 🇭🇺" -msgstr "" - -#. js-lingui-id: T6wyby -#: src/partner-application/partner-application-copy.ts -msgid "I'll book later →" -msgstr "" - -#. js-lingui-id: RYDa0v -#: src/partner-application/data/partner-country-options.ts -msgid "Iceland 🇮🇸" -msgstr "" - -#. js-lingui-id: ePYQjq -#: src/partner-application/partner-application-copy.ts -msgid "Identity" -msgstr "" - -#. js-lingui-id: Grur3I -#: src/platform/releases/release-notes.tsx -msgid "IMAP" -msgstr "" - -#. js-lingui-id: l0JGUk -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Impersonate users" -msgstr "" - -#. js-lingui-id: N4OVNn -#: src/case-studies/case-study-stories.ts -msgid "Implementation" -msgstr "" - -#. js-lingui-id: yHueLx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Implementation partners" -msgstr "" - -#. js-lingui-id: 9P1c4k -#: src/platform/releases/release-notes.tsx -msgid "Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched." -msgstr "" - -#. js-lingui-id: WxaeWx -#: src/platform/releases/release-notes.tsx -msgid "Import Relations" -msgstr "" - -#. js-lingui-id: BHNxPe -#: src/platform/releases/release-notes.tsx -msgid "Import V2" -msgstr "" - -#. js-lingui-id: ZAKTS6 -#: src/sections/product-feature/feature-tiles.ts -msgid "Import your data with field mapping, including relations. Export anytime — your data is always yours." -msgstr "" - -#. js-lingui-id: cCwGqi -#: src/platform/releases/release-notes.tsx -msgid "Improved Onboarding Experience" -msgstr "" - -#. js-lingui-id: 86Q2Qb -#: src/platform/releases/release-notes.tsx -msgid "Improved Performance" -msgstr "" - -#. js-lingui-id: InyU0Z -#: src/case-studies/case-study-stories.ts -msgid "In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect." -msgstr "" - -#. js-lingui-id: d1Aru8 -#: src/sections/helped/helped-scene.tsx -msgid "In production." -msgstr "" - -#. js-lingui-id: Sqb+jp -#: src/sections/product-feature/feature-tiles.ts -msgid "In-app preview for supported file types (when enabled)" -msgstr "" - -#. js-lingui-id: 3XP8Lk -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Included!" -msgstr "" - -#. js-lingui-id: /c4yUr -#: src/partner-application/data/partner-country-options.ts -msgid "India 🇮🇳" -msgstr "" - -#. js-lingui-id: iEJqDi -#: src/partner-application/data/partner-country-options.ts -msgid "Indonesia 🇮🇩" -msgstr "" - -#. js-lingui-id: BQukYF -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Indonesian" -msgstr "" - -#. js-lingui-id: S8gy7K -#: src/sections/case-study-detail/case-study-highlights.tsx -msgid "Industry" -msgstr "" - -#. js-lingui-id: MeL8SS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Infinite scroll" -msgstr "" - -#. js-lingui-id: +mOisw -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Infinite scroll is still coming soon, unlike the invoice." -msgstr "" - -#. js-lingui-id: K8iwJx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Install shared tarball app" -msgstr "" - -#. js-lingui-id: AHWM9N -#: src/case-studies/case-study-stories.ts -msgid "Integration" -msgstr "" - -#. js-lingui-id: OChKCc -#: src/platform/routing/static-website-routes.ts -msgid "Interactive halftone generator exported from Twenty." -msgstr "" - -#. js-lingui-id: +83cJG -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Interested in meeting {partnerName}" -msgstr "" - -#. js-lingui-id: MAqMna -#: src/platform/releases/release-notes.tsx -msgid "Internal Email Privacy" -msgstr "" - -#. js-lingui-id: 0ysJ3C -#: src/platform/releases/release-notes.tsx -msgid "Internal team emails won't sync, protecting privacy by preventing access to internal discussions." -msgstr "" - -#. js-lingui-id: a+PGuG -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Internet accounts per user" -msgstr "" - -#. js-lingui-id: 87rKhU -#: src/platform/releases/release-notes.tsx -msgid "Introduced a \"Data Model Diagram\" feature that allows users to visualize the relationships between different objects within the CRM." -msgstr "" - -#. js-lingui-id: vJncsm -#: src/platform/releases/release-notes.tsx -msgid "Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis." -msgstr "" - -#. js-lingui-id: TR1ici -#: src/platform/releases/release-notes.tsx -msgid "Introduced a new design for notifications featuring lighter colors." -msgstr "" - -#. js-lingui-id: 5G37wD -#: src/platform/releases/release-notes.tsx -msgid "Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today." -msgstr "" - -#. js-lingui-id: 5BnBV4 -#: src/platform/releases/release-notes.tsx -msgid "Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!" -msgstr "" - -#. js-lingui-id: KBwqIW -#: src/platform/releases/release-notes.tsx -msgid "Invite roles" -msgstr "" - -#. js-lingui-id: FtgjCv -#: src/partner-application/data/partner-country-options.ts -msgid "Iran 🇮🇷" -msgstr "" - -#. js-lingui-id: 8yynyz -#: src/partner-application/data/partner-country-options.ts -msgid "Iraq 🇮🇶" -msgstr "" - -#. js-lingui-id: s7XmoY -#: src/partner-application/data/partner-country-options.ts -msgid "Ireland 🇮🇪" -msgstr "" - -#. js-lingui-id: /yQIKP -#: src/sections/faq/faq.data.ts -msgid "Is Twenty really open-source?" -msgstr "" - -#. js-lingui-id: SdtpDP -#: src/partner-application/data/partner-country-options.ts -msgid "Israel 🇮🇱" -msgstr "" - -#. js-lingui-id: QjEULz -#: src/case-studies/case-study-catalog.ts -msgid "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other." -msgstr "" - -#. js-lingui-id: FJ51pP -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -msgid "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not." -msgstr "" - -#. js-lingui-id: kqIAbN -#: src/case-studies/case-study-stories.ts -msgid "It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck." -msgstr "" - -#. js-lingui-id: ltNDOB -#: src/sections/problem/problem.data.ts -msgid "It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden." -msgstr "" - -#. js-lingui-id: Lj7sBL -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Italian" -msgstr "" - -#. js-lingui-id: OSTD8d -#: src/partner-application/data/partner-country-options.ts -msgid "Italy 🇮🇹" -msgstr "" - -#. js-lingui-id: 0BTIQi -#: src/partner-application/data/partner-country-options.ts -msgid "Ivory Coast 🇨🇮" -msgstr "" - -#. js-lingui-id: W6o2Pv -#: src/partner-application/data/partner-country-options.ts -msgid "Jamaica 🇯🇲" -msgstr "" - -#. js-lingui-id: kpk6mj -#: src/partner-application/data/partner-country-options.ts -msgid "Japan 🇯🇵" -msgstr "" - -#. js-lingui-id: dFtidv -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Japanese" -msgstr "" - -#. js-lingui-id: Lsf2+K -#: src/partner-application/partner-application-copy.ts -msgid "Join our ecosystem and help businesses take control of their customer data with open-source primitives." -msgstr "" - -#. js-lingui-id: 1qiriB -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Join our growing partner ecosystem" -msgstr "" - -#. js-lingui-id: VQIurp -#: src/sections/partner-signoff/partner-signoff.tsx -msgid "Join our partner ecosystem and help businesses take control of their CRM." -msgstr "" - -#. js-lingui-id: m/pXki -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "Join the teams that chose to own their CRM. Start building with Twenty today." -msgstr "" - -#. js-lingui-id: QbxNys -#: src/partner-application/data/partner-country-options.ts -msgid "Jordan 🇯🇴" -msgstr "" - -#. js-lingui-id: VnZMnC -#: src/platform/releases/release-notes.tsx -msgid "JSON Field" -msgstr "" - -#. js-lingui-id: pB76mP -#: src/case-studies/case-study-catalog.ts -msgid "Jul 2025" -msgstr "" - -#. js-lingui-id: hvwlu3 -#: src/case-studies/case-study-catalog.ts -msgid "Jun 2025" -msgstr "" - -#. js-lingui-id: qrYDGE -#: src/sections/testimonials/testimonials.data.ts -msgid "Justin Beadle" -msgstr "" - -#. js-lingui-id: vYXuJI -#: src/case-studies/case-study-stories.ts -msgid "Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions." -msgstr "" - -#. js-lingui-id: E6Oohx -#: src/case-studies/case-study-stories.ts -msgid "Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it." -msgstr "" - -#. js-lingui-id: 3LDjR0 -#: src/platform/releases/release-notes.tsx -msgid "Kanbans on any object" -msgstr "" - -#. js-lingui-id: r1cFAW -#: src/partner-application/data/partner-country-options.ts -msgid "Kazakhstan 🇰🇿" -msgstr "" - -#. js-lingui-id: kEahsE -#: src/partner-application/data/partner-country-options.ts -msgid "Kenya 🇰🇪" -msgstr "" - -#. js-lingui-id: TLanjj -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "kept" -msgstr "" - -#. js-lingui-id: IxBSi8 -#: src/partner-application/data/partner-country-options.ts -msgid "Kiribati 🇰🇮" -msgstr "" - -#. js-lingui-id: h6S9Yz -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Korean" -msgstr "" - -#. js-lingui-id: PqhUrP -#: src/partner-application/data/partner-country-options.ts -msgid "Kosovo 🇽🇰" -msgstr "" - -#. js-lingui-id: 3+TwF3 -#: src/partner-application/data/partner-country-options.ts -msgid "Kuwait 🇰🇼" -msgstr "" - -#. js-lingui-id: e9zZkH -#: src/partner-application/data/partner-country-options.ts -msgid "Kyrgyzstan 🇰🇬" -msgstr "" - -#. js-lingui-id: 8QgJZb -#: src/platform/releases/release-notes.tsx -msgid "Labs" -msgstr "" - -#. js-lingui-id: GAmD3h -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/partners-marketplace/partner-facts-list.tsx -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Languages" -msgstr "" - -#. js-lingui-id: u6jooT -#: src/partner-application/partner-application-copy.ts -msgid "Languages spoken" -msgstr "" - -#. js-lingui-id: YHacTY -#: src/partner-application/data/partner-country-options.ts -msgid "Laos 🇱🇦" -msgstr "" - -#. js-lingui-id: 2lrGbG -#: src/partners-marketplace/served-geo-labels.ts -msgid "LATAM" -msgstr "" - -#. js-lingui-id: WvrtRi -#: src/sections/releases-hero/releases-hero.tsx -msgid "" -"Latest\n" -"*Releases*" -msgstr "" - -#. js-lingui-id: 7OHfcc -#: src/partner-application/data/partner-country-options.ts -msgid "Latvia 🇱🇻" -msgstr "" - -#. js-lingui-id: rdU729 -#: src/sections/stepper/product-stepper-data.ts -msgid "Layout" -msgstr "" - -#. js-lingui-id: +Ss/og -#: src/sections/menu/menu.data.ts -msgid "Learn how to use Twenty" -msgstr "" - -#. js-lingui-id: wB0DGn -#: src/partner-application/data/partner-country-options.ts -msgid "Lebanon 🇱🇧" -msgstr "" - -#. js-lingui-id: vifyyw -#: src/sections/footer/footer.data.ts -msgid "Legal" -msgstr "" - -#. js-lingui-id: UqdHpG -#: src/partner-application/data/partner-country-options.ts -msgid "Lesotho 🇱🇸" -msgstr "" - -#. js-lingui-id: rJargy -#: src/partner-application/data/partner-country-options.ts -msgid "Liberia 🇱🇷" -msgstr "" - -#. js-lingui-id: Lzw0kM -#: src/partner-application/data/partner-country-options.ts -msgid "Libya 🇱🇾" -msgstr "" - -#. js-lingui-id: tHFTlp -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Licensee:" -msgstr "" - -#. js-lingui-id: K41WYc -#: src/partner-application/data/partner-country-options.ts -msgid "Liechtenstein 🇱🇮" -msgstr "" - -#. js-lingui-id: ESTOTK -#: src/platform/releases/release-notes.tsx -msgid "Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content." -msgstr "" - -#. js-lingui-id: kvxPie -#: src/platform/releases/release-notes.tsx -msgid "Link field" -msgstr "" - -#. js-lingui-id: gggTBm -#: src/sections/footer/footer.data.ts -msgid "LinkedIn" -msgstr "" - -#. js-lingui-id: 3hSKC5 -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "LinkedIn (opens in new tab)" -msgstr "" - -#. js-lingui-id: Gg69LR -#: src/partner-application/partner-application-copy.ts -msgid "LinkedIn URL" -msgstr "" - -#. js-lingui-id: 2WIZYd -#: src/partner-application/data/partner-country-options.ts -msgid "Lithuania 🇱🇹" -msgstr "" - -#. js-lingui-id: AHVzME -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Live data and AI built" -msgstr "" - -#. js-lingui-id: GObQuL -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Live updates" -msgstr "" - -#. js-lingui-id: zmRZwk -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Live updates are unavailable, which is almost more honest." -msgstr "" - -#. js-lingui-id: ObPscj -#: src/sections/enterprise-activate/enterprise-activate-panel.tsx -msgid "Loading activation…" -msgstr "" - -#. js-lingui-id: Oyf4mg -#: src/contact-cal/contact-cal-modal.tsx -msgid "Loading form…" -msgstr "" - -#. js-lingui-id: Pwqkdw -#: src/partner-application/partner-application-modal.tsx -msgid "Loading…" -msgstr "" - -#. js-lingui-id: 7VBQ2j -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Local, Production" -msgstr "" - -#. js-lingui-id: JO8Bdx -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Lock-in" -msgstr "" - -#. js-lingui-id: sQia9P -#: src/sections/menu/menu.tsx -#: src/sections/menu/menu-drawer.tsx -msgid "Log in" -msgstr "" - -#. js-lingui-id: KPLAuI -#: src/case-studies/case-study-catalog.ts -msgid "Lower CRM cost" -msgstr "" - -#. js-lingui-id: J13skq -#: src/partner-application/data/partner-country-options.ts -msgid "Luxembourg 🇱🇺" -msgstr "" - -#. js-lingui-id: nRYQC8 -#: src/partner-application/data/partner-country-options.ts -msgid "Madagascar 🇲🇬" -msgstr "" - -#. js-lingui-id: /hmUGb -#: src/platform/releases/release-notes.tsx -msgid "Maintenance mode" -msgstr "" - -#. js-lingui-id: BNd15Z -#: src/sections/feature-cards/feature-cards.tsx -msgid "Make your GTM team happy with *a CRM they'll love*" -msgstr "" - -#. js-lingui-id: qHvKxh -#: src/partner-application/data/partner-country-options.ts -msgid "Malawi 🇲🇼" -msgstr "" - -#. js-lingui-id: tF97tn -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Malay" -msgstr "" - -#. js-lingui-id: DIOh5g -#: src/partner-application/data/partner-country-options.ts -msgid "Malaysia 🇲🇾" -msgstr "" - -#. js-lingui-id: 62/ScF -#: src/partner-application/data/partner-country-options.ts -msgid "Maldives 🇲🇻" -msgstr "" - -#. js-lingui-id: wc5E/3 -#: src/partner-application/data/partner-country-options.ts -msgid "Mali 🇲🇱" -msgstr "" - -#. js-lingui-id: 04fjhR -#: src/partner-application/data/partner-country-options.ts -msgid "Malta 🇲🇹" -msgstr "" - -#. js-lingui-id: Si4WyF -#: src/case-studies/case-study-catalog.ts -msgid "Management Consulting" -msgstr "" - -#. js-lingui-id: TMZPkv -#: src/platform/releases/release-notes.tsx -msgid "Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run." -msgstr "" - -#. js-lingui-id: poX06f -#: src/case-studies/case-study-catalog.ts -msgid "Manual work at core" -msgstr "" - -#. js-lingui-id: VJOKPB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Maps view" -msgstr "" - -#. js-lingui-id: Zt5PUS -#: src/partners-marketplace/marketplace-header.tsx -msgid "Marketplace" -msgstr "" - -#. js-lingui-id: 2jVbnO -#: src/partner-application/data/partner-country-options.ts -msgid "Marshall Islands 🇲🇭" -msgstr "" - -#. js-lingui-id: bJNKJ1 -#: src/sections/menu/menu.data.ts -msgid "Master every corner of Twenty" -msgstr "" - -#. js-lingui-id: HG/EUg -#: src/partner-application/data/partner-country-options.ts -msgid "Mauritania 🇲🇷" -msgstr "" - -#. js-lingui-id: YDiaY/ -#: src/partner-application/data/partner-country-options.ts -msgid "Mauritius 🇲🇺" -msgstr "" - -#. js-lingui-id: Zw+Zv+ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "MCP server" -msgstr "" - -#. js-lingui-id: bwCiCi -#: src/sections/menu/menu.data.ts -msgid "Meet the certified agencies and consultants implementing Twenty for teams worldwide." -msgstr "" - -#. js-lingui-id: ujYZ+f -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks." -msgstr "" - -#. js-lingui-id: CQ9M36 -#: src/partners-marketplace/served-geo-labels.ts -msgid "MENA" -msgstr "" - -#. js-lingui-id: +9RIKB -#: src/platform/releases/release-notes.tsx -msgid "Merge Records" -msgstr "" - -#. js-lingui-id: briyJf -#: src/sections/product-feature/feature-tiles.ts -msgid "Metrics you can actually trust." -msgstr "" - -#. js-lingui-id: YBLFQZ -#: src/partner-application/data/partner-country-options.ts -msgid "Mexico 🇲🇽" -msgstr "" - -#. js-lingui-id: KBirDR -#: src/partner-application/data/partner-country-options.ts -msgid "Micronesia 🇫🇲" -msgstr "" - -#. js-lingui-id: YeVpda -#: src/platform/releases/release-notes.tsx -msgid "Microsoft o365 Integration" -msgstr "" - -#. js-lingui-id: so04x6 -#: src/case-studies/case-study-stories.ts -msgid "Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it." -msgstr "" - -#. js-lingui-id: izddzp -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Mike Babiy" -msgstr "" - -#. js-lingui-id: 3TSz9S -#: src/app-preview/stage/traffic-lights.tsx -msgid "Minimize" -msgstr "" - -#. js-lingui-id: FFFENV -#: src/partner-application/partner-application-copy.ts -msgid "Minimum project budget" -msgstr "" - -#. js-lingui-id: 179i38 -#: src/platform/releases/release-notes.tsx -msgid "Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place." -msgstr "" - -#. js-lingui-id: 6m8rMT -#: src/partner-application/data/partner-country-options.ts -msgid "Moldova 🇲🇩" -msgstr "" - -#. js-lingui-id: qRRmSe -#: src/partner-application/data/partner-country-options.ts -msgid "Monaco 🇲🇨" -msgstr "" - -#. js-lingui-id: G+EV+A -#: src/partner-application/data/partner-country-options.ts -msgid "Mongolia 🇲🇳" -msgstr "" - -#. js-lingui-id: 9VDoNp -#: src/partner-application/data/partner-country-options.ts -msgid "Montenegro 🇲🇪" -msgstr "" - -#. js-lingui-id: +8Nek/ -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Monthly" -msgstr "" - -#. js-lingui-id: paxFAm -#: src/platform/releases/release-notes.tsx -msgid "More field relations" -msgstr "" - -#. js-lingui-id: kHdAOE -#: src/platform/releases/release-notes.tsx -msgid "More Field Types, More Power" -msgstr "" - -#. js-lingui-id: VqXuUv -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "More options available!" -msgstr "" - -#. js-lingui-id: AZrhlt -#: src/platform/releases/release-notes.tsx -msgid "More powerful search" -msgstr "" - -#. js-lingui-id: LAFO4Y -#: src/partner-application/data/partner-country-options.ts -msgid "Morocco 🇲🇦" -msgstr "" - -#. js-lingui-id: E4h9+U -#: src/platform/releases/release-notes.tsx -msgid "Morph Many Relationships" -msgstr "" - -#. js-lingui-id: EwJDrS -#: src/partner-application/data/partner-country-options.ts -msgid "Mozambique 🇲🇿" -msgstr "" - -#. js-lingui-id: dlKkNL -#: src/sections/product-feature/feature-tiles.ts -msgid "Multi-file upload on records" -msgstr "" - -#. js-lingui-id: 4nwdYp -#: src/platform/releases/release-notes.tsx -msgid "Multi-Record Workflow Triggers" -msgstr "" - -#. js-lingui-id: S5w2Q/ -#: src/platform/releases/release-notes.tsx -msgid "Multi-Select Field" -msgstr "" - -#. js-lingui-id: Gorywi -#: src/platform/releases/release-notes.tsx -msgid "Multi-Workspace" -msgstr "" - -#. js-lingui-id: QGWbbv -#: src/partner-application/data/partner-country-options.ts -msgid "Myanmar 🇲🇲" -msgstr "" - -#. js-lingui-id: 6YtxFj -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Name" -msgstr "" - -#. js-lingui-id: yYmxee -#: src/partner-application/data/partner-country-options.ts -msgid "Namibia 🇳🇦" -msgstr "" - -#. js-lingui-id: zVOV14 -#: src/partner-application/data/partner-country-options.ts -msgid "Nauru 🇳🇷" -msgstr "" - -#. js-lingui-id: Akl9+2 -#: src/platform/releases/release-notes.tsx -msgid "Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \"Close\" button." -msgstr "" - -#. js-lingui-id: TizFpt -#: src/sections/menu/menu-drawer.tsx -msgid "Navigation menu" -msgstr "" - -#. js-lingui-id: LfNsfa -#: src/sections/stepper/product-stepper-content.tsx -msgid "Need a quick change? Skip the engineering ticket. Customize your workspace in minutes." -msgstr "" - -#. js-lingui-id: 4sbgPq -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -msgid "Need help with customization?" -msgstr "" - -#. js-lingui-id: LNVNNE -#: src/partner-application/data/partner-country-options.ts -msgid "Nepal 🇳🇵" -msgstr "" - -#. js-lingui-id: g60EgR -#: src/partner-application/data/partner-country-options.ts -msgid "Netherlands 🇳🇱" -msgstr "" - -#. js-lingui-id: 8Cp4Of -#: src/case-studies/case-study-stories.ts -msgid "NetZero" -msgstr "" - -#. js-lingui-id: J8ZssL -#: src/sections/helped/helped.data.ts -msgid "NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems." -msgstr "" - -#. js-lingui-id: 7HVBV+ -#: src/case-studies/case-study-catalog.ts -msgid "NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows." -msgstr "" - -#. js-lingui-id: 3PtYTO -#: src/case-studies/case-study-stories.ts -msgid "NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation." -msgstr "" - -#. js-lingui-id: zgjuZq -#: src/platform/releases/release-notes.tsx -msgid "New Array field type" -msgstr "" - -#. js-lingui-id: cU1+gU -#: src/platform/releases/release-notes.tsx -msgid "New record page" -msgstr "" - -#. js-lingui-id: pAKqTG -#: src/platform/releases/release-notes.tsx -msgid "New Settings layout" -msgstr "" - -#. js-lingui-id: a54odP -#: src/platform/releases/release-notes.tsx -msgid "New Side Panel" -msgstr "" - -#. js-lingui-id: /DTtCF -#: src/partner-application/data/partner-country-options.ts -msgid "New Zealand 🇳🇿" -msgstr "" - -#. js-lingui-id: GY6uSc -#: src/partner-application/partner-application-copy.ts -msgid "Next →" -msgstr "" - -#. js-lingui-id: KqojOL -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Next steps" -msgstr "" - -#. js-lingui-id: awYrJD -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Next testimonial" -msgstr "" - -#. js-lingui-id: iBOZv7 -#: src/partner-application/data/partner-country-options.ts -msgid "Nicaragua 🇳🇮" -msgstr "" - -#. js-lingui-id: 61NU7V -#: src/partner-application/data/partner-country-options.ts -msgid "Niger 🇳🇪" -msgstr "" - -#. js-lingui-id: +2NLII -#: src/partner-application/data/partner-country-options.ts -msgid "Nigeria 🇳🇬" -msgstr "" - -#. js-lingui-id: qZ+egR -#: src/case-studies/case-study-catalog.ts -msgid "Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations." -msgstr "" - -#. js-lingui-id: sGuHDu -#: src/case-studies/case-study-stories.ts -msgid "Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day." -msgstr "" - -#. js-lingui-id: G0GGKA -#: src/case-studies/case-study-stories.ts -msgid "Nine Dots Ventures" -msgstr "" - -#. js-lingui-id: 1UzENP -#: src/sections/pricing-plan-table/plan-table-content.tsx -msgid "No" -msgstr "" - -#. js-lingui-id: 6tRXQ4 -#: src/partner-application/partner-application-copy.ts -msgid "No matching country." -msgstr "" - -#. js-lingui-id: 1hNHaC -#: src/case-studies/case-study-stories.ts -msgid "No more renting someone else's *structure*" -msgstr "" - -#. js-lingui-id: LmWdm6 -#: src/case-studies/case-study-stories.ts -msgid "No more renting someone else's structure" -msgstr "" - -#. js-lingui-id: UxK4so -#: src/partners-marketplace/empty-state.tsx -msgid "No partners match your filters" -msgstr "" - -#. js-lingui-id: nDjC8E -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "No session ID provided. Please complete the checkout first." -msgstr "" - -#. js-lingui-id: q9f4Tp -#: src/case-studies/case-study-catalog.ts -msgid "No-code" -msgstr "" - -#. js-lingui-id: SiZ/7E -#: src/sections/faq/faq.data.ts -msgid "No. Build custom objects, fields, views, and no-code workflows straight from Settings. Unlimited, no extra charge." -msgstr "" - -#. js-lingui-id: 096JXI -#: src/partner-application/data/partner-country-options.ts -msgid "North Korea 🇰🇵" -msgstr "" - -#. js-lingui-id: IwF7aJ -#: src/partner-application/data/partner-country-options.ts -msgid "North Macedonia 🇲🇰" -msgstr "" - -#. js-lingui-id: sZwk4U -#: src/partner-application/data/partner-country-options.ts -msgid "Norway 🇳🇴" -msgstr "" - -#. js-lingui-id: 1IipHp -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Norwegian" -msgstr "" - -#. js-lingui-id: YfzRVa -#: src/platform/releases/release-notes.tsx -msgid "Notes and Tasks standard objects" -msgstr "" - -#. js-lingui-id: iDNBZe -#: src/platform/releases/release-notes.tsx -msgid "Notifications" -msgstr "" - -#. js-lingui-id: k3T2mM -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you." -msgstr "" - -#. js-lingui-id: CzeIij -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Number of dashboards" -msgstr "" - -#. js-lingui-id: pkrZnO -#: src/case-studies/case-study-stories.ts -msgid "Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first." -msgstr "" - -#. js-lingui-id: l/1LQc -#: src/sections/testimonials/testimonials.data.ts -msgid "Olivier Reinaud" -msgstr "" - -#. js-lingui-id: BdShAR -#: src/partner-application/data/partner-country-options.ts -msgid "Oman 🇴🇲" -msgstr "" - -#. js-lingui-id: D2b+1q -#: src/case-studies/case-study-catalog.ts -msgid "On a single CRM" -msgstr "" - -#. js-lingui-id: w5ATz2 -#: src/platform/releases/release-notes.tsx -msgid "On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones." -msgstr "" - -#. js-lingui-id: XhXmzW -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "On this page" -msgstr "" - -#. js-lingui-id: jxC7HY -#: src/partner-application/data/partner-scope-options.ts -msgid "Onboarding · Documentation · Change management · L1/L2 support · Managed services" -msgstr "" - -#. js-lingui-id: pbmZ7R -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Onboarding Packs" -msgstr "" - -#. js-lingui-id: 37OSdM -#: src/case-studies/case-study-stories.ts -msgid "One *API* to rule them all" -msgstr "" - -#. js-lingui-id: Zt1UZb -#: src/case-studies/case-study-stories.ts -msgid "One API to rule them all" -msgstr "" - -#. js-lingui-id: pShqss -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Only $5 for SSO. Practically a charity program." -msgstr "" - -#. js-lingui-id: GSr0rF -#: src/sections/menu/menu.tsx -msgid "Open menu" -msgstr "" - -#. js-lingui-id: pkXQA+ -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Open your Twenty self-hosted instance Settings → Enterprise." -msgstr "" - -#. js-lingui-id: 5RkmVr -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -msgid "Open-source, AI-ready, and yours to shape." -msgstr "" - -#. js-lingui-id: ucgZ0o -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Organization" -msgstr "" - -#. js-lingui-id: nDTfhz -#: src/platform/releases/release-notes.tsx -msgid "Other improvements" -msgstr "" - -#. js-lingui-id: 3PlK59 -#: src/platform/releases/release-notes.tsx -msgid "Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden." -msgstr "" - -#. js-lingui-id: dKGg8T -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Out of stock" -msgstr "" - -#. js-lingui-id: PASC/7 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Outlived every redesign since 2004." -msgstr "" - -#. js-lingui-id: Bwsi7B -#: src/sections/helped/helped.data.ts -msgid "Own your CRM end to end" -msgstr "" - -#. js-lingui-id: oDAEQq -#: src/case-studies/case-study-stories.ts -msgid "Ownership" -msgstr "" - -#. js-lingui-id: NmF/Vo -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Owning your stack remains mysteriously out of stock." -msgstr "" - -#. js-lingui-id: h/oMMb -#: src/platform/routing/static-website-routes.ts -msgid "Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform." -msgstr "" - -#. js-lingui-id: +AiiMt -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Pagination builds character." -msgstr "" - -#. js-lingui-id: sW3DaS -#: src/partner-application/data/partner-country-options.ts -msgid "Pakistan 🇵🇰" -msgstr "" - -#. js-lingui-id: cvRU36 -#: src/partner-application/data/partner-country-options.ts -msgid "Palau 🇵🇼" -msgstr "" - -#. js-lingui-id: u2htNd -#: src/partner-application/data/partner-country-options.ts -msgid "Palestine 🇵🇸" -msgstr "" - -#. js-lingui-id: pWLp16 -#: src/partner-application/data/partner-country-options.ts -msgid "Panama 🇵🇦" -msgstr "" - -#. js-lingui-id: xOR4tu -#: src/partner-application/data/partner-country-options.ts -msgid "Papua New Guinea 🇵🇬" -msgstr "" - -#. js-lingui-id: kb3PhK -#: src/partner-application/data/partner-country-options.ts -msgid "Paraguay 🇵🇾" -msgstr "" - -#. js-lingui-id: cLitIC -#: src/partner-application/partner-application-modal.tsx -msgid "Partner application" -msgstr "" - -#. js-lingui-id: mYGIvm -#: src/partners-marketplace/partner-profile.tsx -msgid "Partner facts and contact" -msgstr "" - -#. js-lingui-id: 4RPECg -#: src/app/[locale]/(site)/partners/profile/[slug]/page.tsx -msgid "Partner not found — Twenty Partners" -msgstr "" - -#. js-lingui-id: dRIK0d -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Partner testimonials" -msgstr "" - -#. js-lingui-id: mPkInZ -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Partners" -msgstr "" - -#. js-lingui-id: 9yo8NN -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Paste the key and click Activate." -msgstr "" - -#. js-lingui-id: TMErUt -#: src/platform/releases/release-notes.tsx -msgid "Percentage in number fields" -msgstr "" - -#. js-lingui-id: v1i9+n -#: src/platform/releases/release-notes.tsx -msgid "Performance Improvements" -msgstr "" - -#. js-lingui-id: JjOHl8 -#: src/platform/releases/release-notes.tsx -msgid "Permissions V1" -msgstr "" - -#. js-lingui-id: kJQ+gL -#: src/platform/releases/release-notes.tsx -msgid "Permissions V2" -msgstr "" - -#. js-lingui-id: OzAIDr -#: src/partner-application/data/partner-country-options.ts -msgid "Peru 🇵🇪" -msgstr "" - -#. js-lingui-id: LqRs8D -#: src/partner-application/data/partner-country-options.ts -msgid "Philippines 🇵🇭" -msgstr "" - -#. js-lingui-id: we6gj5 -#: src/partner-application/partner-application-copy.ts -msgid "Pick every category that applies." -msgstr "" - -#. js-lingui-id: KEEuJt -#: src/platform/releases/release-notes.tsx -msgid "Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client." -msgstr "" - -#. js-lingui-id: FFkjaT -#: src/sections/product-feature/feature-tiles.ts -msgid "Pipeline Management" -msgstr "" - -#. js-lingui-id: gzkkC3 -#: src/platform/routing/static-website-routes.ts -msgid "Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use." -msgstr "" - -#. js-lingui-id: z7gnI9 -#: src/partner-application/partner-application-copy.ts -msgid "Please complete all required fields before continuing." -msgstr "" - -#. js-lingui-id: AFr2a5 -#: src/partner-application/data/partner-country-options.ts -msgid "Poland 🇵🇱" -msgstr "" - -#. js-lingui-id: trnWaw -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Polish" -msgstr "" - -#. js-lingui-id: /LAeug -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Portrait of {authorName}" -msgstr "" - -#. js-lingui-id: 8BrmUs -#: src/partner-application/data/partner-country-options.ts -msgid "Portugal 🇵🇹" -msgstr "" - -#. js-lingui-id: MOERNx -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Portuguese" -msgstr "" - -#. js-lingui-id: z87IFG -#: src/partner-application/partner-application-copy.ts -msgid "Press Enter or comma to add a skill." -msgstr "" - -#. js-lingui-id: LZoO8F -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Previous testimonial" -msgstr "" - -#. js-lingui-id: a7u1N9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Price" -msgstr "" - -#. js-lingui-id: aHCEmh -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/partners-marketplace/partner-money-row.tsx -msgid "Pricing" -msgstr "" - -#. js-lingui-id: T/R+Qz -#: src/sections/menu/menu-nav.tsx -#: src/sections/menu/menu-drawer.tsx -msgid "Primary" -msgstr "" - -#. js-lingui-id: J2IAmT -#: src/sections/three-cards/three-cards.data.ts -msgid "Principal and Founder" -msgstr "" - -#. js-lingui-id: kXBQYM -#: src/sections/testimonials/partner-testimonials.data.ts -#: src/case-studies/case-study-catalog.ts -msgid "Principal and Founder, Alternative Partners" -msgstr "" - -#. js-lingui-id: k62X/2 -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Priority support" -msgstr "" - -#. js-lingui-id: LcET2C -#: src/sections/footer/footer.data.ts -#: src/app/[locale]/(site)/privacy-policy/page.tsx -msgid "Privacy Policy" -msgstr "" - -#. js-lingui-id: DJ3uVe -#: src/platform/routing/static-website-routes.ts -msgid "Privacy Policy | Twenty" -msgstr "" - -#. js-lingui-id: 3fPjUY -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Pro" -msgstr "" - -#. js-lingui-id: K47k8R -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Product" -msgstr "" - -#. js-lingui-id: kIGKva -#: src/sections/three-cards/three-cards.data.ts -msgid "Production grade quality" -msgstr "" - -#. js-lingui-id: vERlcd -#: src/partner-application/partner-application-copy.ts -msgid "Profile" -msgstr "" - -#. js-lingui-id: CcK9cq -#: src/case-studies/case-study-stories.ts -msgid "Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around." -msgstr "" - -#. js-lingui-id: PaHxQd -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Project minimum" -msgstr "" - -#. js-lingui-id: 9NAqO4 -#: src/case-studies/case-study-catalog.ts -msgid "Proposal automation" -msgstr "" - -#. js-lingui-id: a24q7E -#: src/sections/problem/problem.data.ts -msgid "Proprietary languages, slow deployment cycles, and \"black box\" logic." -msgstr "" - -#. js-lingui-id: u9RZ7+ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Punjabi" -msgstr "" - -#. js-lingui-id: frfCYp -#: src/case-studies/case-study-catalog.ts -msgid "Q1 2026" -msgstr "" - -#. js-lingui-id: tFx+ES -#: src/partner-application/data/partner-country-options.ts -msgid "Qatar 🇶🇦" -msgstr "" - -#. js-lingui-id: OialmJ -#: src/platform/releases/release-notes.tsx -msgid "Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input." -msgstr "" - -#. js-lingui-id: 3XOwjg -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Rates" -msgstr "" - -#. js-lingui-id: zXRspj -#: src/platform/releases/release-notes.tsx -msgid "Rating field" -msgstr "" - -#. js-lingui-id: DnWJal -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Reach out" -msgstr "" - -#. js-lingui-id: gSQVmr -#: src/sections/helped/helped-card.tsx -msgid "Read the case" -msgstr "" - -#. js-lingui-id: EqCbT9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Read/Edit/Delete permissions" -msgstr "" - -#. js-lingui-id: /6qiAz -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -msgid "" -"Ready to build\n" -"*your own story?*" -msgstr "" - -#. js-lingui-id: TqQ08B -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "" -"Ready to grow\n" -"*with Twenty?*" -msgstr "" - -#. js-lingui-id: zTY2by -#: src/platform/routing/static-website-routes.ts -msgid "Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit." -msgstr "" - -#. js-lingui-id: NIwjHh -#: src/case-studies/case-study-catalog.ts -msgid "Real Estate" -msgstr "" - -#. js-lingui-id: CH+Ona -#: src/sections/customers-hero/customers-hero.tsx -msgid "Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth." -msgstr "" - -#. js-lingui-id: 5O1eTm -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Real-time changes? That will be a premium surprise." -msgstr "" - -#. js-lingui-id: 4hc7hc -#: src/sections/three-cards/product-three-cards-data.ts -#: src/sections/product-feature/feature-tiles.ts -msgid "Real-time data" -msgstr "" - -#. js-lingui-id: dKQCrj -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Real-time is a state of mind, not a feature." -msgstr "" - -#. js-lingui-id: P7gVBH -#: src/platform/releases/release-notes.tsx -msgid "Record is created or updated trigger" -msgstr "" - -#. js-lingui-id: Zhiuz9 -#: src/case-studies/case-study-catalog.ts -msgid "Record quarter" -msgstr "" - -#. js-lingui-id: PWlTvh -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Records" -msgstr "" - -#. js-lingui-id: q45OlW -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Regions" -msgstr "" - -#. js-lingui-id: GtQZI0 -#: src/platform/releases/release-notes.tsx -msgid "Relation Fields on Record Page" -msgstr "" - -#. js-lingui-id: plY6Rp -#: src/platform/releases/release-notes.tsx -msgid "Relations on Record Pages" -msgstr "" - -#. js-lingui-id: rwWjWg -#: src/sections/footer/footer.data.ts -msgid "Release Notes" -msgstr "" - -#. js-lingui-id: 5icoS1 -#: src/sections/releases-feed/releases-feed.tsx -#: src/sections/menu/menu.data.ts -msgid "Releases" -msgstr "" - -#. js-lingui-id: BkBq/5 -#. placeholder {0}: pill.text -#: src/partners-marketplace/active-filter-pills.tsx -msgid "Remove {0} filter" -msgstr "" - -#. js-lingui-id: OY7BZk -#: src/partner-application/partner-application-copy.ts -msgid "Remove {skill}" -msgstr "" - -#. js-lingui-id: a/aGHe -#: src/sections/product-feature/feature-tiles.ts -msgid "Rename, download, and delete attachments" -msgstr "" - -#. js-lingui-id: t9yxlZ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Reports" -msgstr "" - -#. js-lingui-id: SY/an2 -#: src/sections/product-feature/feature-tiles.ts -msgid "Reports & Dashboards" -msgstr "" - -#. js-lingui-id: TD9BOQ -#: src/app-preview/terminal/terminal-send-button.tsx -msgid "Reset conversation" -msgstr "" - -#. js-lingui-id: ZYyPd8 -#: src/platform/releases/release-notes.tsx -msgid "Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts." -msgstr "" - -#. js-lingui-id: tpLAlL -#: src/platform/releases/release-notes.tsx -msgid "Resize navbar and side panel" -msgstr "" - -#. js-lingui-id: s+MGs7 -#: src/sections/menu/menu.data.ts -msgid "Resources" -msgstr "" - -#. js-lingui-id: oC2l7f -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "REST & GraphQL API" -msgstr "" - -#. js-lingui-id: kx0s+n -#: src/case-studies/case-study-stories.ts -msgid "Results" -msgstr "" - -#. js-lingui-id: 2itg0p -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Retro 2015" -msgstr "" - -#. js-lingui-id: H0dEn+ -#: src/app-preview/stage/flying-traffic-lights.tsx -msgid "Return traffic light" -msgstr "" - -#. js-lingui-id: k2x4+M -#: src/platform/releases/release-notes.tsx -msgid "Revamp View Options Menu" -msgstr "" - -#. js-lingui-id: 7xiRJz -#: src/platform/releases/release-notes.tsx -msgid "Revamped Navigation Bar" -msgstr "" - -#. js-lingui-id: lHXjXQ -#: src/platform/releases/release-notes.tsx -msgid "Revamped Side Panel" -msgstr "" - -#. js-lingui-id: frqduN -#: src/sections/product-feature/feature-tiles.ts -msgid "Rich notes attached to records" -msgstr "" - -#. js-lingui-id: i4ofLR -#: src/platform/releases/release-notes.tsx -msgid "Rich text layouts" -msgstr "" - -#. js-lingui-id: /gaSVU -#: src/case-studies/case-study-stories.ts -msgid "Roadmap" -msgstr "" - -#. js-lingui-id: mLp5AP -#: src/partner-application/data/partner-country-options.ts -msgid "Romania 🇷🇴" -msgstr "" - -#. js-lingui-id: uJc01W -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Romanian" -msgstr "" - -#. js-lingui-id: Wdh41P -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Row-level permissions" -msgstr "" - -#. js-lingui-id: mRpuWW -#: src/case-studies/case-study-stories.ts -msgid "Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks." -msgstr "" - -#. js-lingui-id: T1ut28 -#: src/partner-application/data/partner-country-options.ts -msgid "Russia 🇷🇺" -msgstr "" - -#. js-lingui-id: nji0/X -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Russian" -msgstr "" - -#. js-lingui-id: dw8D3T -#: src/partner-application/data/partner-country-options.ts -msgid "Rwanda 🇷🇼" -msgstr "" - -#. js-lingui-id: niLOap -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Kitts & Nevis 🇰🇳" -msgstr "" - -#. js-lingui-id: zCHzF/ -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Lucia 🇱🇨" -msgstr "" - -#. js-lingui-id: Md/8iQ -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Vincent 🇻🇨" -msgstr "" - -#. js-lingui-id: Burn4/ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesfarce Add-on Center" -msgstr "" - -#. js-lingui-id: xTfEgV -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesfarce Pro" -msgstr "" - -#. js-lingui-id: /UolBB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesforce Classic" -msgstr "" - -#. js-lingui-id: l69E+u -#: src/case-studies/case-study-catalog.ts -msgid "Salesforce migration" -msgstr "" - -#. js-lingui-id: CADlRK -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same CRM" -msgstr "" - -#. js-lingui-id: 60i6S+ -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same output" -msgstr "" - -#. js-lingui-id: xl2tJ9 -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same results" -msgstr "" - -#. js-lingui-id: w9QWxz -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "SAML/OIDC SSO" -msgstr "" - -#. js-lingui-id: R38ZPo -#: src/partner-application/data/partner-country-options.ts -msgid "Samoa 🇼🇸" -msgstr "" - -#. js-lingui-id: fK288K -#: src/partner-application/data/partner-country-options.ts -msgid "San Marino 🇸🇲" -msgstr "" - -#. js-lingui-id: KDcBQd -#: src/partner-application/data/partner-country-options.ts -msgid "São Tomé & Príncipe 🇸🇹" -msgstr "" - -#. js-lingui-id: /BK0Nl -#: src/partner-application/data/partner-country-options.ts -msgid "Saudi Arabia 🇸🇦" -msgstr "" - -#. js-lingui-id: elz5ka -#: src/case-studies/case-study-catalog.ts -msgid "Saved / month" -msgstr "" - -#. js-lingui-id: h3C5H8 -#: src/platform/releases/release-notes.tsx -msgid "Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace." -msgstr "" - -#. js-lingui-id: bifv6N -#: src/case-studies/case-study-stories.ts -msgid "Scale" -msgstr "" - -#. js-lingui-id: aI/fdL -#: src/case-studies/case-study-stories.ts -msgid "Scale without *breaking operations*" -msgstr "" - -#. js-lingui-id: 842ybw -#: src/case-studies/case-study-stories.ts -msgid "Scale without breaking operations" -msgstr "" - -#. js-lingui-id: vk6sVR -#: src/partner-application/partner-application-copy.ts -msgid "Search a country…" -msgstr "" - -#. js-lingui-id: +yNkue -#: src/platform/releases/release-notes.tsx -msgid "Search in field pickers and add-column menus makes table and layout customization faster." -msgstr "" - -#. js-lingui-id: HVOGoW -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Seats limit" -msgstr "" - -#. js-lingui-id: a3LDKx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Security" -msgstr "" - -#. js-lingui-id: nmVU/t -#: src/sections/customers-hero/customers-hero.tsx -msgid "" -"See how teams\n" -"build *on Twenty*" -msgstr "" - -#. js-lingui-id: aB+XpI -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "See more features" -msgstr "" - -#. js-lingui-id: JDp1bg -#: src/sections/three-cards/product-three-cards-data.ts -msgid "See updates as they happen. Work with your team and agents seamlessly." -msgstr "" - -#. js-lingui-id: 0kgOPB -#. placeholder {0}: LATEST_RELEASE.release -#: src/sections/menu/menu.data.ts -msgid "See what shipped in {0}" -msgstr "" - -#. js-lingui-id: 02ePaq -#. placeholder {0}: company.name -#: src/sections/product-feature/contacts-visual.tsx -msgid "Select {0}" -msgstr "" - -#. js-lingui-id: wgNoIs -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -msgid "Select all" -msgstr "" - -#. js-lingui-id: 6p/m5q -#: src/partner-application/partner-application-copy.ts -msgid "Select your country" -msgstr "" - -#. js-lingui-id: sXYD/i -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "self" -msgstr "" - -#. js-lingui-id: 6JhL+3 -#: src/case-studies/case-study-catalog.ts -msgid "Self-hosted" -msgstr "" - -#. js-lingui-id: QFK/45 -#: src/partner-application/data/partner-scope-options.ts -msgid "Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring" -msgstr "" - -#. js-lingui-id: 42Nf4Y -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted *means control*" -msgstr "" - -#. js-lingui-id: zuU9UU -#: src/platform/releases/release-notes.tsx -msgid "Self-hosted billing" -msgstr "" - -#. js-lingui-id: 5CWy3T -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs." -msgstr "" - -#. js-lingui-id: 5WmQ5O -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted means control" -msgstr "" - -#. js-lingui-id: WxVgfh -#: src/platform/releases/release-notes.tsx -msgid "Self-hosted workspaces can now track usage more cleanly with usage-based billing support." -msgstr "" - -#. js-lingui-id: GrBvv/ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Self-hosting" -msgstr "" - -#. js-lingui-id: YdhUoe -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Self-hosting, now for rent!" -msgstr "" - -#. js-lingui-id: uVBq8r -#: src/platform/releases/release-notes.tsx -msgid "Self-Onboarding" -msgstr "" - -#. js-lingui-id: NaHz2o -#: src/sections/pricing-plans/self-host-toggle.tsx -msgid "Selfhosting" -msgstr "" - -#. js-lingui-id: pi1oME -#: src/app-preview/terminal/terminal-send-button.tsx -msgid "Send message" -msgstr "" - -#. js-lingui-id: D50Vyu -#: src/partner-application/data/partner-country-options.ts -msgid "Senegal 🇸🇳" -msgstr "" - -#. js-lingui-id: eEJlq0 -#: src/partner-application/data/partner-country-options.ts -msgid "Serbia 🇷🇸" -msgstr "" - -#. js-lingui-id: 62gxWx -#: src/partner-application/data/partner-country-options.ts -msgid "Seychelles 🇸🇨" -msgstr "" - -#. js-lingui-id: 3VFzsh -#: src/sections/helped/helped.data.ts -msgid "Ship a product on Twenty" -msgstr "" - -#. js-lingui-id: Ta0ts5 -#: src/app-preview/terminal/diff/diff-pill.tsx -msgid "Show changes" -msgstr "" - -#. js-lingui-id: 6lGV3K -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Show less" -msgstr "" - -#. js-lingui-id: RhU4bB -#: src/partners-marketplace/filter-bar.tsx -msgid "Showing {visibleCount} of {totalCount} partners" -msgstr "" - -#. js-lingui-id: I89wN/ -#: src/partners-marketplace/filter-bar.tsx -msgid "Showing all {totalCount} partners" -msgstr "" - -#. js-lingui-id: 9k9PMD -#: src/platform/releases/release-notes.tsx -msgid "Sidebar items" -msgstr "" - -#. js-lingui-id: yhyNch -#: src/partner-application/data/partner-country-options.ts -msgid "Sierra Leone 🇸🇱" -msgstr "" - -#. js-lingui-id: mA6cL1 -#: src/sections/faq/faq.data.ts -msgid "Sign up for Cloud in under a minute and start your 30-day trial. For larger rollouts, our 4-hour Onboarding Packs or certified partners get you live in 1–2 weeks." -msgstr "" - -#. js-lingui-id: qTFDyz -#: src/sections/pricing-plans/pricing-intro.tsx -msgid "" -"Simple\n" -"*Pricing*" -msgstr "" - -#. js-lingui-id: 0eG5g+ -#: src/partner-application/data/partner-country-options.ts -msgid "Singapore 🇸🇬" -msgstr "" - -#. js-lingui-id: V9dFwD -#: src/sections/footer/footer.data.ts -msgid "Sitemap" -msgstr "" - -#. js-lingui-id: c+cRP3 -#: src/platform/releases/release-notes.tsx -msgid "Skeleton Loading" -msgstr "" - -#. js-lingui-id: PCSkw2 -#: src/partners-marketplace/partner-profile.tsx -msgid "Skills" -msgstr "" - -#. js-lingui-id: t6ComU -#: src/sections/feature-cards/feature-cards.tsx -msgid "Skip the clunky UX that always comes with custom." -msgstr "" - -#. js-lingui-id: U7keXg -#: src/partner-application/data/partner-country-options.ts -msgid "Slovakia 🇸🇰" -msgstr "" - -#. js-lingui-id: o1VTTF -#: src/partner-application/data/partner-country-options.ts -msgid "Slovenia 🇸🇮" -msgstr "" - -#. js-lingui-id: 1v/aHN -#: src/platform/releases/release-notes.tsx -msgid "Smart ⌘K" -msgstr "" - -#. js-lingui-id: bUmSwL -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute." -msgstr "" - -#. js-lingui-id: GUqjZ0 -#: src/sections/footer/footer-bottom.tsx -msgid "Social media" -msgstr "" - -#. js-lingui-id: b+F/Ih -#: src/platform/releases/release-notes.tsx -msgid "Soft Delete" -msgstr "" - -#. js-lingui-id: L58Ivq -#: src/platform/releases/release-notes.tsx -msgid "Soft delete feature added: Deleted records are now hidden from view but recoverable from the \"Deleted record\" option in any object options menu. No more drama!" -msgstr "" - -#. js-lingui-id: 6sKjjx -#: src/partner-application/data/partner-team-type-options.ts -msgid "Solo" -msgstr "" - -#. js-lingui-id: FX2oa1 -#: src/partner-application/partner-application-copy.ts -msgid "Solo or agency?" -msgstr "" - -#. js-lingui-id: TcZtfs -#: src/partner-application/data/partner-country-options.ts -msgid "Solomon Islands 🇸🇧" -msgstr "" - -#. js-lingui-id: TvdMI3 -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Solutioning" -msgstr "" - -#. js-lingui-id: t1E06j -#: src/partner-application/data/partner-country-options.ts -msgid "Somalia 🇸🇴" -msgstr "" - -#. js-lingui-id: AVfp38 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons." -msgstr "" - -#. js-lingui-id: Lllsp+ -#: src/platform/releases/release-notes.tsx -msgid "Some teammate changes now appear right away, so collaboration feels faster and more up to date." -msgstr "" - -#. js-lingui-id: B/mYo/ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Source code access" -msgstr "" - -#. js-lingui-id: zHJB/O -#: src/partner-application/data/partner-country-options.ts -msgid "South Africa 🇿🇦" -msgstr "" - -#. js-lingui-id: 7MdTKh -#: src/partner-application/data/partner-country-options.ts -msgid "South Korea 🇰🇷" -msgstr "" - -#. js-lingui-id: a4jo+V -#: src/partner-application/data/partner-country-options.ts -msgid "South Sudan 🇸🇸" -msgstr "" - -#. js-lingui-id: Kv3C8d -#: src/partner-application/data/partner-country-options.ts -msgid "Spain 🇪🇸" -msgstr "" - -#. js-lingui-id: 65A04M -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Spanish" -msgstr "" - -#. js-lingui-id: 00jcbn -#: src/partner-application/data/partner-country-options.ts -msgid "Sri Lanka 🇱🇰" -msgstr "" - -#. js-lingui-id: vnS6Rf -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "SSO" -msgstr "" - -#. js-lingui-id: uQl22y -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Standard support" -msgstr "" - -#. js-lingui-id: wxW2Sv -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Start automating at huge scale!" -msgstr "" - -#. js-lingui-id: XO628f -#: src/sections/pricing-plans/plan-card.tsx -msgid "Start for free" -msgstr "" - -#. js-lingui-id: sBOFB0 -#: src/sections/pricing-plans/pricing-intro.tsx -msgid "" -"Start your free trial today\n" -"without credit card." -msgstr "" - -#. js-lingui-id: ThcPyu -#: src/sections/stepper/stepper.data.ts -msgid "Stay in control with our *open-source software*" -msgstr "" - -#. js-lingui-id: j9c8rb -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Stay in Flow" -msgstr "" - -#. js-lingui-id: GdGiNi -#: src/partner-application/partner-application-copy.ts -msgid "Step {current} of {total}" -msgstr "" - -#. js-lingui-id: bxgoJR -#: src/sections/menu/menu.data.ts -msgid "Step-by-step guides and playbooks to help your team get the most out of their workspace." -msgstr "" - -#. js-lingui-id: jKt86V -#: src/sections/faq/faq.tsx -msgid "Stop fighting custom. *Start building, with Twenty*" -msgstr "" - -#. js-lingui-id: UCLArd -#: src/sections/three-cards/three-cards.tsx -#: src/sections/three-cards/product-three-cards.tsx -msgid "Stop settling for trade-offs." -msgstr "" - -#. js-lingui-id: hjgBcp -#: src/platform/releases/release-notes.tsx -msgid "Stop Workflow Button" -msgstr "" - -#. js-lingui-id: 3QIOGT -#: src/platform/releases/release-notes.tsx -msgid "Sub-field Filtering" -msgstr "" - -#. js-lingui-id: eVPr22 -#: src/platform/releases/release-notes.tsx -msgid "Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field." -msgstr "" - -#. js-lingui-id: Sv4BSp -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Subdomain (yourco.twenty.com)" -msgstr "" - -#. js-lingui-id: H5/rZQ -#: src/partner-application/partner-application-copy.ts -msgid "Submit application" -msgstr "" - -#. js-lingui-id: MDqQmP -#: src/partner-application/partner-application-copy.ts -msgid "Submitting…" -msgstr "" - -#. js-lingui-id: 8Z1557 -#: src/partner-application/data/partner-country-options.ts -msgid "Sudan 🇸🇩" -msgstr "" - -#. js-lingui-id: XYLcNv -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Support" -msgstr "" - -#. js-lingui-id: Aq66kg -#: src/partner-application/data/partner-country-options.ts -msgid "Suriname 🇸🇷" -msgstr "" - -#. js-lingui-id: Yz+oFV -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Swahili" -msgstr "" - -#. js-lingui-id: 6u3kqB -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "swap" -msgstr "" - -#. js-lingui-id: b2//Ip -#: src/partner-application/data/partner-country-options.ts -msgid "Sweden 🇸🇪" -msgstr "" - -#. js-lingui-id: UaISq3 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Swedish" -msgstr "" - -#. js-lingui-id: IImT5c -#: src/partner-application/data/partner-country-options.ts -msgid "Switzerland 🇨🇭" -msgstr "" - -#. js-lingui-id: sjuSub -#: src/partner-application/data/partner-country-options.ts -msgid "Syria 🇸🇾" -msgstr "" - -#. js-lingui-id: 3w+Aox -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Table, Kanban, Calendar" -msgstr "" - -#. js-lingui-id: ISVD3+ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Tagalog" -msgstr "" - -#. js-lingui-id: 9M02G5 -#: src/sections/stepper/product-stepper-data.ts -msgid "Tailor record pages, menus, and views" -msgstr "" - -#. js-lingui-id: boABlR -#: src/partner-application/data/partner-country-options.ts -msgid "Taiwan 🇹🇼" -msgstr "" - -#. js-lingui-id: XJspRJ -#: src/partner-application/data/partner-country-options.ts -msgid "Tajikistan 🇹🇯" -msgstr "" - -#. js-lingui-id: jYsF4G -#: src/platform/releases/release-notes.tsx -msgid "Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time." -msgstr "" - -#. js-lingui-id: JAKtcG -#: src/sections/product-hero/product-hero.tsx -#: src/sections/home-hero/home-hero.tsx -#: src/sections/footer/footer.data.ts -#: src/sections/faq/faq.tsx -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -#: src/contact-cal/contact-cal-modal.tsx -msgid "Talk to us" -msgstr "" - -#. js-lingui-id: fb427h -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Tamil" -msgstr "" - -#. js-lingui-id: ri1l89 -#: src/partner-application/data/partner-country-options.ts -msgid "Tanzania 🇹🇿" -msgstr "" - -#. js-lingui-id: GWMpL3 -#: src/sections/product-feature/feature-tiles.ts -msgid "Tasks & Activities" -msgstr "" - -#. js-lingui-id: Ye3KKA -#: src/sections/menu/menu.data.ts -msgid "Team up with a Twenty expert" -msgstr "" - -#. js-lingui-id: vsdUaL -#: src/sections/releases-hero/releases-hero.tsx -msgid "Technical notes" -msgstr "" - -#. js-lingui-id: y+bLyB -#: src/partner-application/partner-application-copy.ts -msgid "Technical skills" -msgstr "" - -#. js-lingui-id: Hevu8X -#: src/app-preview/terminal/terminal-toggle.tsx -msgid "Terminal mode" -msgstr "" - -#. js-lingui-id: mvP/25 -#: src/sections/footer/footer.data.ts -msgid "Terms and Conditions" -msgstr "" - -#. js-lingui-id: xowcRf -#: src/app/[locale]/(site)/terms/page.tsx -msgid "Terms of Service" -msgstr "" - -#. js-lingui-id: BEX1RA -#: src/platform/routing/static-website-routes.ts -msgid "Terms of Service | Twenty" -msgstr "" - -#. js-lingui-id: VUZDlr -#: src/sections/testimonials/testimonials-carousel.tsx -msgid "Testimonials" -msgstr "" - -#. js-lingui-id: SUr44j -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Thai" -msgstr "" - -#. js-lingui-id: 6t7gpr -#: src/partner-application/data/partner-country-options.ts -msgid "Thailand 🇹🇭" -msgstr "" - -#. js-lingui-id: Pa/Y6/ -#: src/partner-application/partner-application-copy.ts -msgid "" -"Thanks, you're in.\n" -"*Now book your intro call.*" -msgstr "" - -#. js-lingui-id: FjkPYg -#: src/case-studies/case-study-stories.ts -msgid "That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients." -msgstr "" - -#. js-lingui-id: 8S4psU -#: src/case-studies/case-study-stories.ts -msgid "That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer." -msgstr "" - -#. js-lingui-id: zXlFuT -#: src/platform/routing/static-website-routes.ts -msgid "The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business." -msgstr "" - -#. js-lingui-id: K1T7Mn -#: src/platform/releases/release-notes.tsx -msgid "The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record." -msgstr "" - -#. js-lingui-id: KzqOXm -#: src/platform/releases/release-notes.tsx -msgid "The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \"Retail,\" \"Technology,\" and \"Finance,\" enabling more nuanced segmentation and analysis." -msgstr "" - -#. js-lingui-id: 6wVgAW -#: src/case-studies/case-study-stories.ts -msgid "The bet is *paying off*" -msgstr "" - -#. js-lingui-id: NT2bSJ -#: src/case-studies/case-study-stories.ts -msgid "The bet is paying off" -msgstr "" - -#. js-lingui-id: Wie492 -#: src/case-studies/case-study-stories.ts -msgid "The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in." -msgstr "" - -#. js-lingui-id: 2kHqXc -#: src/case-studies/case-study-stories.ts -msgid "The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them." -msgstr "" - -#. js-lingui-id: EYi+kT -#: src/case-studies/case-study-stories.ts -msgid "The CRM as a *control hub*" -msgstr "" - -#. js-lingui-id: 2sfVd8 -#: src/case-studies/case-study-stories.ts -msgid "The CRM as a control hub" -msgstr "" - -#. js-lingui-id: XlFsoH -#: src/case-studies/case-study-stories.ts -msgid "The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant." -msgstr "" - -#. js-lingui-id: kCUcnD -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed." -msgstr "" - -#. js-lingui-id: MaHqAc -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -msgid "The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly." -msgstr "" - -#. js-lingui-id: Q5iZ9Q -#: src/case-studies/case-study-stories.ts -msgid "The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy." -msgstr "" - -#. js-lingui-id: l0eUFC -#: src/case-studies/case-study-stories.ts -msgid "The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever." -msgstr "" - -#. js-lingui-id: SW9clW -#: src/sections/why-twenty-hero/why-twenty-hero.tsx -msgid "The future of CRM is built, *not bought.*" -msgstr "" - -#. js-lingui-id: sm10Rg -#: src/sections/problem/problem.data.ts -msgid "The Giant Monolith" -msgstr "" - -#. js-lingui-id: nFB8I1 -#: src/sections/problem/problem.data.ts -msgid "The In-house Burden" -msgstr "" - -#. js-lingui-id: ZNzKXV -#: src/case-studies/case-study-stories.ts -msgid "The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic." -msgstr "" - -#. js-lingui-id: nf1NnD -#: src/platform/releases/release-notes.tsx -msgid "The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields." -msgstr "" - -#. js-lingui-id: tADBQB -#: src/platform/releases/release-notes.tsx -msgid "The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads." -msgstr "" - -#. js-lingui-id: q1kKLq -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "The opportunity" -msgstr "" - -#. js-lingui-id: 80f4ed -#: src/sections/menu/menu.data.ts -msgid "The principles and product philosophy behind the open source CRM." -msgstr "" - -#. js-lingui-id: 2NJdyz -#: src/sections/problem/problem.tsx -msgid "The Problem." -msgstr "" - -#. js-lingui-id: GTy93s -#: src/platform/releases/release-notes.tsx -msgid "The record page now features a clearer layout with increased space for content" -msgstr "" - -#. js-lingui-id: 3/wAFg -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "The result" -msgstr "" - -#. js-lingui-id: nAWeyi -#: src/case-studies/case-study-stories.ts -msgid "The result is a system that fits how AC&T already worked, instead of the other way around." -msgstr "" - -#. js-lingui-id: WENmFq -#: src/case-studies/case-study-stories.ts -msgid "The right *foundation*" -msgstr "" - -#. js-lingui-id: nbHA9N -#: src/case-studies/case-study-stories.ts -msgid "The right foundation" -msgstr "" - -#. js-lingui-id: g8h2v+ -#: src/platform/releases/release-notes.tsx -msgid "The search feature now includes ranking scores. This helps you find the most relevant results faster." -msgstr "" - -#. js-lingui-id: 9CCRtB -#: src/platform/releases/release-notes.tsx -msgid "The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results." -msgstr "" - -#. js-lingui-id: omVXTg -#: src/case-studies/case-study-stories.ts -msgid "The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source." -msgstr "" - -#. js-lingui-id: 1tN3qf -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "The shift" -msgstr "" - -#. js-lingui-id: iW6MjB -#: src/platform/releases/release-notes.tsx -msgid "The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature." -msgstr "" - -#. js-lingui-id: AnGOwN -#: src/case-studies/case-study-stories.ts -msgid "The situation" -msgstr "" - -#. js-lingui-id: gXGp3Q -#: src/sections/menu/menu.data.ts -msgid "The story behind Twenty" -msgstr "" - -#. js-lingui-id: axo4rg -#: src/platform/routing/static-website-routes.ts -msgid "The terms governing your use of Twenty and its open source CRM services." -msgstr "" - -#. js-lingui-id: xCAT8U -#: src/platform/releases/release-notes.tsx -msgid "The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events" -msgstr "" - -#. js-lingui-id: u0uFxg -#: src/sections/testimonials/testimonials-carousel.tsx -msgid "They are the real sales" -msgstr "" - -#. js-lingui-id: 53RXLB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "They call it customer loyalty. We call it a very affectionate cage." -msgstr "" - -#. js-lingui-id: RhmZMe -#: src/case-studies/case-study-stories.ts -msgid "They did not just replace a tool. They took back ownership of how their business runs." -msgstr "" - -#. js-lingui-id: ZnqwXn -#: src/case-studies/case-study-stories.ts -msgid "They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother." -msgstr "" - -#. js-lingui-id: 5YzqyT -#: src/case-studies/case-study-stories.ts -msgid "They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control." -msgstr "" - -#. js-lingui-id: AUV+TY -#: src/app-preview/terminal/thinking-indicator.tsx -msgid "Thinking" -msgstr "" - -#. js-lingui-id: 8gek0+ -#: src/platform/releases/release-notes.tsx -msgid "This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate." -msgstr "" - -#. js-lingui-id: 6f8QUY -#: src/partner-application/data/partner-country-options.ts -msgid "Timor-Leste 🇹🇱" -msgstr "" - -#. js-lingui-id: WwTFtc -#: src/platform/releases/release-notes.tsx -msgid "To enhance privacy, you can now add specific email addresses to a blocklist within the \"Accounts\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals." -msgstr "" - -#. js-lingui-id: ijf9QM -#: src/platform/releases/release-notes.tsx -msgid "To maintain the simplicity of Twenty, we are introducing \"Advanced Settings.\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings." -msgstr "" - -#. js-lingui-id: DeTupk -#: src/partner-application/data/partner-country-options.ts -msgid "Togo 🇹🇬" -msgstr "" - -#. js-lingui-id: CocxTO -#: src/partner-application/data/partner-country-options.ts -msgid "Tonga 🇹🇴" -msgstr "" - -#. js-lingui-id: 5eFktS -#: src/case-studies/case-study-catalog.ts -msgid "Tool integration" -msgstr "" - -#. js-lingui-id: xv7HSr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "total per month with fixed cost" -msgstr "" - -#. js-lingui-id: hmu++i -#: src/sections/product-feature/feature-tiles.ts -msgid "Track amount and close date" -msgstr "" - -#. js-lingui-id: POzmFl -#: src/sections/menu/menu.data.ts -msgid "Track every release with changelogs, highlights and demos of the newest features." -msgstr "" - -#. js-lingui-id: 6vHPh9 -#: src/sections/product-hero/product-hero.tsx -msgid "Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence." -msgstr "" - -#. js-lingui-id: xwWQ9Q -#: src/partners-marketplace/partner-scope-labels.ts -msgid "Training & Adoption" -msgstr "" - -#. js-lingui-id: MtCqjl -#: src/partner-application/data/partner-scope-options.ts -msgid "Training, Adoption & Support" -msgstr "" - -#. js-lingui-id: VhVAzf -#: src/platform/releases/release-notes.tsx -msgid "Translation in 30+ Languages" -msgstr "" - -#. js-lingui-id: /ga9kq -#: src/partner-application/data/partner-country-options.ts -msgid "Trinidad & Tobago 🇹🇹" -msgstr "" - -#. js-lingui-id: tdZpCd -#: src/sections/footer/footer.data.ts -msgid "Trust Center" -msgstr "" - -#. js-lingui-id: HlusPQ -#: src/sections/pricing-salesfarce/pricing-salesfarce.tsx -msgid "Trust the n°1 CRM, *or not!*" -msgstr "" - -#. js-lingui-id: KtyN0b -#: src/sections/trusted-by/trusted-by.tsx -msgid "trusted by" -msgstr "" - -#. js-lingui-id: QZdPWP -#: src/sections/trusted-by/trusted-by.tsx -msgid "Trusted by leading organizations" -msgstr "" - -#. js-lingui-id: eslLQF -#: src/sections/product-demo/product-demo.tsx -msgid "Try it live" -msgstr "" - -#. js-lingui-id: qhmtws -#: src/partners-marketplace/empty-state.tsx -msgid "Try removing some filters or browse all partners." -msgstr "" - -#. js-lingui-id: E/hGy3 -#: src/sections/product-demo/product-demo.tsx -msgid "Try Twenty Cloud" -msgstr "" - -#. js-lingui-id: D5Kf4t -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours." -msgstr "" - -#. js-lingui-id: y4UxlS -#: src/partner-application/data/partner-country-options.ts -msgid "Tunisia 🇹🇳" -msgstr "" - -#. js-lingui-id: UIDKnJ -#: src/partner-application/data/partner-country-options.ts -msgid "Turkey 🇹🇷" -msgstr "" - -#. js-lingui-id: Kz91g/ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Turkish" -msgstr "" - -#. js-lingui-id: kdJl4v -#: src/partner-application/data/partner-country-options.ts -msgid "Turkmenistan 🇹🇲" -msgstr "" - -#. js-lingui-id: tSc/a3 -#: src/partner-application/data/partner-country-options.ts -msgid "Tuvalu 🇹🇻" -msgstr "" - -#. js-lingui-id: O5dAmW -#: src/platform/routing/static-website-routes.ts -msgid "Twenty | #1 Open Source CRM" -msgstr "" - -#. js-lingui-id: NalB1c -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform." -msgstr "" - -#. js-lingui-id: fZsVj6 -#: src/case-studies/case-study-stories.ts -msgid "" -"Twenty as the\n" -"*API backbone* of a go-to-market stack" -msgstr "" - -#. js-lingui-id: +w9xZW -#: src/case-studies/case-study-catalog.ts -msgid "Twenty as the API backbone of a go-to-market stack" -msgstr "" - -#. js-lingui-id: zj0CA+ -#: src/case-studies/case-study-stories.ts -msgid "Twenty as the API backbone of a go-to-market stack | Elevate Consulting" -msgstr "" - -#. js-lingui-id: neM1Ol -#: src/platform/routing/static-website-routes.ts -msgid "Twenty CRM Features — Modern Open Source CRM Platform" -msgstr "" - -#. js-lingui-id: 8zCqPL -#: src/platform/routing/static-website-routes.ts -msgid "Twenty CRM Pricing — Plans from $9 per User per Month" -msgstr "" - -#. js-lingui-id: D05UQH -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Customers — How Modern Teams Run Their CRM" -msgstr "" - -#. js-lingui-id: MYHdd/ -#: src/case-studies/case-study-stories.ts -msgid "Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market." -msgstr "" - -#. js-lingui-id: fwep/o -#: src/case-studies/case-study-stories.ts -msgid "Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it." -msgstr "" - -#. js-lingui-id: 0qyMhk -#: src/sections/home-hero/home-hero.tsx -msgid "Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves." -msgstr "" - -#. js-lingui-id: jVhq41 -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform." -msgstr "" - -#. js-lingui-id: x/I85y -#: src/case-studies/case-study-stories.ts -msgid "Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible." -msgstr "" - -#. js-lingui-id: zvfdHM -#: src/case-studies/case-study-stories.ts -msgid "Twenty is the heart of the system. Everything branches from it." -msgstr "" - -#. js-lingui-id: K+zzSQ -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "Twenty lets us build a CRM around the business and not the business around the CRM." -msgstr "" - -#. js-lingui-id: AxT+g4 -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Twenty makes it simple. It's clean, intuitive, and built to feel like Notion." -msgstr "" - -#. js-lingui-id: mZ3xRm -#: src/sections/menu/menu.data.ts -msgid "Twenty partner ecosystem" -msgstr "" - -#. js-lingui-id: 4SJucz -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Partners — Certified Open Source CRM Implementers" -msgstr "" - -#. js-lingui-id: vD7S1X -#. placeholder {0}: LATEST_RELEASE.release -#. placeholder {1}: LATEST_RELEASE.title -#: src/sections/menu/menu.data.ts -msgid "Twenty release {0} — {1}" -msgstr "" - -#. js-lingui-id: X1GHuJ -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Releases — What's New in the Open Source CRM" -msgstr "" - -#. js-lingui-id: V1lV7B -#: src/sections/pricing-plans/plans-data.ts -msgid "Twenty team support" -msgstr "" - -#. js-lingui-id: osa7Xg -#: src/sections/menu/menu.data.ts -msgid "Twenty user guide preview" -msgstr "" - -#. js-lingui-id: KsFvUt -#: src/partners-marketplace/marketplace-header.tsx -msgid "Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call." -msgstr "" - -#. js-lingui-id: tuvLv1 -#: src/platform/releases/release-notes.tsx -msgid "Two Factor Authentication" -msgstr "" - -#. js-lingui-id: EIU345 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Two-factor authentication" -msgstr "" - -#. js-lingui-id: O+vc/1 -#: src/partner-application/partner-application-copy.ts -msgid "Type of team *" -msgstr "" - -#. js-lingui-id: P+R1Lc -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Typical project" -msgstr "" - -#. js-lingui-id: HqFilh -#: src/partner-application/data/partner-country-options.ts -msgid "UAE 🇦🇪" -msgstr "" - -#. js-lingui-id: +WNTxL -#: src/partner-application/data/partner-country-options.ts -msgid "Uganda 🇺🇬" -msgstr "" - -#. js-lingui-id: uxuy4l -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "UI theme" -msgstr "" - -#. js-lingui-id: tNfmmF -#: src/partner-application/data/partner-country-options.ts -msgid "UK 🇬🇧" -msgstr "" - -#. js-lingui-id: z7UkhA -#: src/partner-application/data/partner-country-options.ts -msgid "Ukraine 🇺🇦" -msgstr "" - -#. js-lingui-id: V9+2pH -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Ukrainian" -msgstr "" - -#. js-lingui-id: jqzUyM -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Unavailable" -msgstr "" - -#. js-lingui-id: Hix/m6 -#: src/sections/product-feature/feature-tiles.ts -msgid "Unified timeline (emails, events, tasks, notes, files)" -msgstr "" - -#. js-lingui-id: NIuIk1 -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Unlimited" -msgstr "" - -#. js-lingui-id: q7vKOJ -#: src/platform/releases/release-notes.tsx -msgid "Unlisted Views" -msgstr "" - -#. js-lingui-id: aGpTSC -#: src/sections/pricing-plans/plans-data.ts -msgid "Up to 5 workspaces" -msgstr "" - -#. js-lingui-id: KQsreu -#: src/platform/releases/release-notes.tsx -msgid "Updated by" -msgstr "" - -#. js-lingui-id: SPdRRU -#: src/partner-application/data/partner-scope-options.ts -msgid "Upfront consulting, scoping, strategy." -msgstr "" - -#. js-lingui-id: WLb3m4 -#: src/platform/releases/release-notes.tsx -msgid "Upgraded Search" -msgstr "" - -#. js-lingui-id: 2vanwz -#: src/sections/product-feature/feature-tiles.ts -msgid "Upload, rename, preview, and manage files directly on records. Everything stays where it belongs." -msgstr "" - -#. js-lingui-id: tmwuH9 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Urdu" -msgstr "" - -#. js-lingui-id: huOaG8 -#: src/partner-application/data/partner-country-options.ts -msgid "Uruguay 🇺🇾" -msgstr "" - -#. js-lingui-id: RCOibx -#: src/partners-marketplace/served-geo-labels.ts -msgid "US" -msgstr "" - -#. js-lingui-id: LXHEIS -#: src/partner-application/data/partner-country-options.ts -msgid "USA 🇺🇸" -msgstr "" - -#. js-lingui-id: Roaswv -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "User Guide" -msgstr "" - -#. js-lingui-id: 9iX1i3 -#: src/platform/releases/release-notes.tsx -msgid "User impersonation" -msgstr "" - -#. js-lingui-id: 3XIgKU -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "User roles" -msgstr "" - -#. js-lingui-id: UCUX2+ -#: src/partner-application/data/partner-scope-options.ts -msgid "User-side rollout & ongoing support." -msgstr "" - -#. js-lingui-id: FOOEtP -#: src/partner-application/data/partner-country-options.ts -msgid "Uzbekistan 🇺🇿" -msgstr "" - -#. js-lingui-id: CRXL2j -#: src/partner-application/data/partner-country-options.ts -msgid "Vanuatu 🇻🇺" -msgstr "" - -#. js-lingui-id: NNeEYO -#: src/partner-application/data/partner-country-options.ts -msgid "Vatican 🇻🇦" -msgstr "" - -#. js-lingui-id: BWzac4 -#: src/partner-application/data/partner-country-options.ts -msgid "Venezuela 🇻🇪" -msgstr "" - -#. js-lingui-id: fDWr8s -#: src/platform/releases/release-notes.tsx -msgid "Version control" -msgstr "" - -#. js-lingui-id: FlQ1vR -#: src/partner-application/data/partner-country-options.ts -msgid "Vietnam 🇻🇳" -msgstr "" - -#. js-lingui-id: fROFIL -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Vietnamese" -msgstr "" - -#. js-lingui-id: BRBSny -#. placeholder {0}: partner.name -#: src/partners-marketplace/partner-card.tsx -msgid "View {0} on LinkedIn" -msgstr "" - -#. js-lingui-id: V4nZs/ -#: src/platform/releases/release-notes.tsx -msgid "View Groups" -msgstr "" - -#. js-lingui-id: ITdNGt -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "View on LinkedIn" -msgstr "" - -#. js-lingui-id: 73lp8c -#: src/partners-marketplace/partner-card.tsx -msgid "View profile" -msgstr "" - -#. js-lingui-id: BAzC1v -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "View types" -msgstr "" - -#. js-lingui-id: mHtVst -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Visualize your customers on a map!" -msgstr "" - -#. js-lingui-id: CsHuOr -#: src/sections/three-cards/three-cards.data.ts -msgid "VP of Engineering" -msgstr "" - -#. js-lingui-id: uRh799 -#: src/sections/testimonials/testimonials.data.ts -msgid "VP of Engineering at W3villa Technologies" -msgstr "" - -#. js-lingui-id: w2INie -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "VP of Engineering, W3villa Technologies" -msgstr "" - -#. js-lingui-id: s0tU5h -#: src/case-studies/case-study-stories.ts -msgid "W3Grads" -msgstr "" - -#. js-lingui-id: R8BueT -#: src/case-studies/case-study-stories.ts -msgid "W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone." -msgstr "" - -#. js-lingui-id: 7hHsoV -#: src/sections/helped/helped.data.ts -msgid "W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone." -msgstr "" - -#. js-lingui-id: QBOUnd -#: src/case-studies/case-study-catalog.ts -msgid "W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing." -msgstr "" - -#. js-lingui-id: 7q5Vjn -#: src/sections/three-cards/three-cards.data.ts -msgid "W3villa Technologies" -msgstr "" - -#. js-lingui-id: ZabLEt -#: src/case-studies/case-study-stories.ts -msgid "W3villa Technologies set out to solve it properly, not with a workaround, but with a product." -msgstr "" - -#. js-lingui-id: 3v2ipf -#: src/sections/three-cards/three-cards.data.ts -msgid "W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves." -msgstr "" - -#. js-lingui-id: k1Pevc -#: src/platform/releases/release-notes.tsx -msgid "We are pleased to reopen the cloud subscription to everyone. No more waiting!" -msgstr "" - -#. js-lingui-id: 8CHatv -#: src/partner-application/partner-application-copy.ts -msgid "We could not submit your application. Please try again in a moment." -msgstr "" - -#. js-lingui-id: ofRgSN -#: src/case-studies/case-study-stories.ts -msgid "We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." -msgstr "" - -#. js-lingui-id: MjWeUE -#: src/sections/testimonials/testimonials.data.ts -msgid "We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." -msgstr "" - -#. js-lingui-id: GVxbgf -#: src/platform/releases/release-notes.tsx -msgid "We have improved app performance, shaving off over 500ms on each page." -msgstr "" - -#. js-lingui-id: 6C4xTI -#: src/platform/releases/release-notes.tsx -msgid "We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks." -msgstr "" - -#. js-lingui-id: l7iJRt -#: src/platform/releases/release-notes.tsx -msgid "We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV." -msgstr "" - -#. js-lingui-id: d5CWI6 -#: src/sections/partner-hero/partner-hero.tsx -msgid "We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us." -msgstr "" - -#. js-lingui-id: DFlq8J -#: src/platform/releases/release-notes.tsx -msgid "We’ve added an \"any field search\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \"Mobile,\" \"Office,\" or \"Direct Line\" field." -msgstr "" - -#. js-lingui-id: kenNyf -#: src/platform/releases/release-notes.tsx -msgid "We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars." -msgstr "" - -#. js-lingui-id: 5CT1rV -#: src/platform/releases/release-notes.tsx -msgid "We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!" -msgstr "" - -#. js-lingui-id: xBnjMX -#: src/platform/releases/release-notes.tsx -msgid "We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well." -msgstr "" - -#. js-lingui-id: v1kQyJ -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Webhooks" -msgstr "" - -#. js-lingui-id: ZhnM/K -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Webhooks (Change Data Capture)" -msgstr "" - -#. js-lingui-id: K4G86X -#: src/platform/releases/release-notes.tsx -msgid "Webhooks filter" -msgstr "" - -#. js-lingui-id: FaPmsq -#: src/platform/releases/release-notes.tsx -msgid "Webhooks multi-object filtering" -msgstr "" - -#. js-lingui-id: hgDePr -#: src/partner-application/partner-application-copy.ts -msgid "Website or GitHub" -msgstr "" - -#. js-lingui-id: Lx0cVD -#: src/partner-application/data/partner-scope-options.ts -msgid "What an admin can do without writing code." -msgstr "" - -#. js-lingui-id: Z34FQq -#: src/case-studies/case-study-stories.ts -msgid "What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company." -msgstr "" - -#. js-lingui-id: phiBjc -#: src/sections/faq/faq.data.ts -msgid "What does Twenty cost?" -msgstr "" - -#. js-lingui-id: WVQaGB -#: src/case-studies/case-study-stories.ts -msgid "What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible." -msgstr "" - -#. js-lingui-id: iOAq7n -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "What is next" -msgstr "" - -#. js-lingui-id: tWd6MT -#: src/case-studies/case-study-stories.ts -msgid "What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together." -msgstr "" - -#. js-lingui-id: kRfFDB -#: src/partners-marketplace/partner-profile.tsx -msgid "What they do" -msgstr "" - -#. js-lingui-id: aYRqmz -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "What this means" -msgstr "" - -#. js-lingui-id: QCHIzm -#: src/partner-application/partner-application-copy.ts -msgid "What you cover *" -msgstr "" - -#. js-lingui-id: 1kfjxX -#: src/case-studies/case-study-stories.ts -msgid "Whatever came next had to be something they could own." -msgstr "" - -#. js-lingui-id: cs6VpJ -#: src/case-studies/case-study-stories.ts -msgid "When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop." -msgstr "" - -#. js-lingui-id: chISDP -#: src/platform/releases/release-notes.tsx -msgid "When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects." -msgstr "" - -#. js-lingui-id: qqPUvu -#: src/case-studies/case-study-stories.ts -msgid "When the channel is *the business*" -msgstr "" - -#. js-lingui-id: JglRo/ -#: src/case-studies/case-study-stories.ts -msgid "When the channel is the business" -msgstr "" - -#. js-lingui-id: nkkLPM -#: src/case-studies/case-study-stories.ts -msgid "When the vendor *pulled the plug*" -msgstr "" - -#. js-lingui-id: DajeYD -#: src/case-studies/case-study-stories.ts -msgid "When the vendor pulled the plug" -msgstr "" - -#. js-lingui-id: 8SbakK -#: src/case-studies/case-study-stories.ts -msgid "" -"When your CRM is\n" -"*the product*" -msgstr "" - -#. js-lingui-id: OQ41z8 -#: src/case-studies/case-study-catalog.ts -msgid "When your CRM is the product" -msgstr "" - -#. js-lingui-id: Svuneu -#: src/case-studies/case-study-stories.ts -msgid "When your CRM is the product: W3Grads on Twenty | W3villa Technologies" -msgstr "" - -#. js-lingui-id: 2O07UN -#: src/partners-marketplace/partner-profile.tsx -msgid "Where & how" -msgstr "" - -#. js-lingui-id: bGN8u+ -#: src/case-studies/case-study-stories.ts -msgid "While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty." -msgstr "" - -#. js-lingui-id: DJlSwA -#: src/sections/menu/menu.data.ts -msgid "Why" -msgstr "" - -#. js-lingui-id: mrxgOV -#: src/sections/menu/menu.data.ts -msgid "Why teams choose Twenty" -msgstr "" - -#. js-lingui-id: 4sOVu+ -#: src/sections/footer/footer.data.ts -msgid "Why Twenty" -msgstr "" - -#. js-lingui-id: DH7vVZ -#: src/platform/routing/static-website-routes.ts -msgid "Why Twenty — The Open Source CRM Built to Be Customised" -msgstr "" - -#. js-lingui-id: tetjz4 -#: src/sections/menu/menu.data.ts -msgid "Why Twenty illustration" -msgstr "" - -#. js-lingui-id: 7KJZ0z -#: src/app-preview/stage/traffic-lights.tsx -msgid "Window controls" -msgstr "" - -#. js-lingui-id: V+BOYT -#: src/platform/releases/release-notes.tsx -msgid "With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control." -msgstr "" - -#. js-lingui-id: edwOmb -#: src/platform/releases/release-notes.tsx -msgid "With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines." -msgstr "" - -#. js-lingui-id: OKVlnc -#: src/case-studies/case-study-stories.ts -msgid "With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket." -msgstr "" - -#. js-lingui-id: OX5bbs -#: src/partner-application/partner-application-copy.ts -msgid "Work email *" -msgstr "" - -#. js-lingui-id: 5VGHpF -#: src/platform/releases/release-notes.tsx -msgid "Workflow branches" -msgstr "" - -#. js-lingui-id: 9MLcn+ -#: src/platform/releases/release-notes.tsx -msgid "Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation." -msgstr "" - -#. js-lingui-id: XYIks/ -#: src/platform/releases/release-notes.tsx -msgid "Workflow Bulk Select" -msgstr "" - -#. js-lingui-id: gDMfQI -#: src/platform/releases/release-notes.tsx -msgid "Workflow Filters" -msgstr "" - -#. js-lingui-id: aNVMLK -#: src/platform/releases/release-notes.tsx -msgid "Workflow improvements" -msgstr "" - -#. js-lingui-id: EnPi2W -#: src/platform/releases/release-notes.tsx -msgid "Workflow Iterator Node" -msgstr "" - -#. js-lingui-id: jN2u/p -#: src/platform/releases/release-notes.tsx -msgid "Workflow Search Node Limit" -msgstr "" - -#. js-lingui-id: woYYQq -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Workflows" -msgstr "" - -#. js-lingui-id: OteDxj -#: src/case-studies/case-study-stories.ts -msgid "Workflows that *actually get used*" -msgstr "" - -#. js-lingui-id: AzqmMJ -#: src/case-studies/case-study-stories.ts -msgid "Workflows that actually get used" -msgstr "" - -#. js-lingui-id: pmUArF -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Workspace" -msgstr "" - -#. js-lingui-id: bwECg/ -#: src/partner-application/partner-application-copy.ts -msgid "Workspace URL, customer references, relevant links…" -msgstr "" - -#. js-lingui-id: p3ZD6C -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "X (opens in new tab)" -msgstr "" - -#. js-lingui-id: zkWmBh -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Yearly" -msgstr "" - -#. js-lingui-id: S6izIJ -#: src/partner-application/data/partner-country-options.ts -msgid "Yemen 🇾🇪" -msgstr "" - -#. js-lingui-id: l75CjT -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-content.tsx -msgid "Yes" -msgstr "" - -#. js-lingui-id: bo6pUs -#: src/sections/faq/faq.data.ts -msgid "Yes, with our Apps framework. Scaffold an extension with `npx create-twenty-app` and ship custom objects, server-side logic functions, React components that render inside Twenty’s UI, AI skills and agents, views, and navigation, all in TypeScript, deployable to any workspace." -msgstr "" - -#. js-lingui-id: yIcBW6 -#: src/sections/faq/faq.data.ts -msgid "Yes. Every Cloud workspace ships with a native MCP server. Connect your AI assistant via OAuth and it can read and write your CRM data in natural language." -msgstr "" - -#. js-lingui-id: 8xYMYQ -#: src/sections/faq/faq.data.ts -msgid "Yes. Import your data via CSV, or use our API for 50,000+ records. Our partners can handle the full migration for you." -msgstr "" - -#. js-lingui-id: 8m0eN9 -#: src/sections/faq/faq.data.ts -msgid "Yes. Twenty is the #1 Open Source CRM on GitHub. You can self-host to fully own your infrastructure, or run it on our managed cloud for a zero-ops setup." -msgstr "" - -#. js-lingui-id: Q3GDrw -#: src/platform/releases/release-notes.tsx -msgid "You can now add your views to favorites for quick access and organize your favorites into folders for better management." -msgstr "" - -#. js-lingui-id: wvm+7M -#: src/platform/releases/release-notes.tsx -msgid "You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions." -msgstr "" - -#. js-lingui-id: Wg/o59 -#: src/platform/releases/release-notes.tsx -msgid "You can now create number fields that display a percentage instead of a regular number." -msgstr "" - -#. js-lingui-id: BAWUUs -#: src/platform/releases/release-notes.tsx -msgid "You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link." -msgstr "" - -#. js-lingui-id: nbc7CM -#: src/platform/releases/release-notes.tsx -msgid "You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)" -msgstr "" - -#. js-lingui-id: dCaNPC -#: src/platform/releases/release-notes.tsx -msgid "You can now edit one-to-many relations directly from the \"many side\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company." -msgstr "" - -#. js-lingui-id: HX2309 -#: src/platform/releases/release-notes.tsx -msgid "You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field." -msgstr "" - -#. js-lingui-id: /eqpqH -#: src/platform/releases/release-notes.tsx -msgid "You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created." -msgstr "" - -#. js-lingui-id: HeaQGk -#: src/platform/releases/release-notes.tsx -msgid "You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience." -msgstr "" - -#. js-lingui-id: l2z97k -#: src/platform/releases/release-notes.tsx -msgid "You can now link your Microsoft account to easily manage your messages and events right within your workspace." -msgstr "" - -#. js-lingui-id: QN6ytb -#: src/platform/releases/release-notes.tsx -msgid "You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection." -msgstr "" - -#. js-lingui-id: pYoGew -#: src/platform/releases/release-notes.tsx -msgid "You can now navigate from one object to another directly from the record detail page." -msgstr "" - -#. js-lingui-id: mpOPSr -#: src/platform/releases/release-notes.tsx -msgid "You can now preview file attachments without downloading them." -msgstr "" - -#. js-lingui-id: PoxYsC -#: src/platform/releases/release-notes.tsx -msgid "You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons." -msgstr "" - -#. js-lingui-id: S4LCu8 -#: src/platform/releases/release-notes.tsx -msgid "You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content." -msgstr "" - -#. js-lingui-id: uS4RtA -#: src/platform/releases/release-notes.tsx -msgid "You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently" -msgstr "" - -#. js-lingui-id: px+QAM -#: src/platform/releases/release-notes.tsx -msgid "You can now see who last updated a record" -msgstr "" - -#. js-lingui-id: OVoVQg -#: src/platform/releases/release-notes.tsx -msgid "You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace." -msgstr "" - -#. js-lingui-id: eheMXY -#: src/platform/releases/release-notes.tsx -msgid "You can now trigger workflows when a record is created or updated." -msgstr "" - -#. js-lingui-id: XEEpNj -#: src/platform/releases/release-notes.tsx -msgid "You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object." -msgstr "" - -#. js-lingui-id: LJ3sTb -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter." -msgstr "" - -#. js-lingui-id: AUzqeZ -#: src/platform/releases/release-notes.tsx -msgid "You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows." -msgstr "" - -#. js-lingui-id: SfJVcK -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance." -msgstr "" - -#. js-lingui-id: krHgj1 -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Your enterprise key" -msgstr "" - -#. js-lingui-id: +dxjCu -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Your enterprise license has been activated successfully." -msgstr "" - -#. js-lingui-id: pEQiCY -#: src/partner-application/partner-application-copy.ts -msgid "Your name *" -msgstr "" - -#. js-lingui-id: fQATWn -#: src/sections/product-feature/feature-tiles.ts -msgid "Your network, fully mapped." -msgstr "" - -#. js-lingui-id: sgod9b -#: src/platform/releases/release-notes.tsx -msgid "Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code." -msgstr "" - -#. js-lingui-id: CgGN5T -#: src/partner-application/data/partner-country-options.ts -msgid "Zambia 🇿🇲" -msgstr "" - -#. js-lingui-id: wHjFOw -#: src/case-studies/case-study-catalog.ts -msgid "Zero" -msgstr "" - -#. js-lingui-id: ZvEoMq -#: src/case-studies/case-study-stories.ts -msgid "Zero manual work at the core. Full automation. Built on Twenty." -msgstr "" - -#. js-lingui-id: TT3YXb -#: src/partner-application/data/partner-country-options.ts -msgid "Zimbabwe 🇿🇼" -msgstr "" - -#. js-lingui-id: ACjxWW -#: src/app-preview/stage/traffic-lights.tsx -msgid "Zoom" -msgstr "" diff --git a/packages/twenty-website-redone/src/locales/fr-FR.po b/packages/twenty-website-redone/src/locales/fr-FR.po deleted file mode 100644 index 7f753312d1..0000000000 --- a/packages/twenty-website-redone/src/locales/fr-FR.po +++ /dev/null @@ -1,6384 +0,0 @@ -msgid "" -msgstr "" -"POT-Creation-Date: 2026-06-11 02:05+0500\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: @lingui/cli\n" -"Language: fr-FR\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Plural-Forms: \n" - -#. js-lingui-id: BUIzFF -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "-33% off" -msgstr "" - -#. js-lingui-id: AGZHx4 -#: src/sections/product-hero/product-hero.tsx -msgid "...with AI that actually helps you *work faster*" -msgstr "" - -#. js-lingui-id: Z6mKXu -#. placeholder {0}: partner.name -#: src/app/[locale]/(site)/partners/profile/[slug]/page.tsx -msgid "{0} — Twenty Partner" -msgstr "" - -#. js-lingui-id: sGt3Jm -#. placeholder {0}: i18n._(card.attribution.company) -#: src/sections/three-cards/illustration-card.tsx -msgid "{0} case study" -msgstr "Étude de cas {0}" - -#. js-lingui-id: jC5JCB -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "{count} Case Studies" -msgstr "" - -#. js-lingui-id: NSO/FI -#: src/partners-marketplace/partner-rates-panel.tsx -#: src/partners-marketplace/partner-money-row.tsx -msgid "{hourly}/hr" -msgstr "" - -#. js-lingui-id: rAP+km -#: src/partners-marketplace/filter-dropdown.tsx -msgid "{labelText} filter" -msgstr "" - -#. js-lingui-id: 7hlEpj -#. placeholder {0}: selected.size -#: src/partners-marketplace/filter-dropdown.tsx -msgid "{labelText} filter, {0} selected" -msgstr "" - -#. js-lingui-id: 0Qb9by -#: src/case-studies/case-study-stories.ts -msgid "*150 hours* saved every month" -msgstr "" - -#. js-lingui-id: k3IzYC -#: src/case-studies/case-study-stories.ts -msgid "*Zero manual work* at the core" -msgstr "" - -#. js-lingui-id: icND7o -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "/ seat / month - billed yearly" -msgstr "" - -#. js-lingui-id: XUqxHW -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "/user/month" -msgstr "" - -#. js-lingui-id: UEDohT -#: src/sections/footer/footer-bottom.tsx -msgid "© {year} – Twenty" -msgstr "© {year} – Twenty" - -#. js-lingui-id: 2ygf/L -#: src/partner-application/partner-application-copy.ts -msgid "← Back" -msgstr "" - -#. js-lingui-id: 9j/bUt -#: src/partners-marketplace/back-to-marketplace-link.tsx -msgid "← Twenty partners" -msgstr "" - -#. js-lingui-id: foGG8A -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$105/user per month" -msgstr "" - -#. js-lingui-id: Bsq9GJ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$35/user per month" -msgstr "" - -#. js-lingui-id: mWSpW5 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$5/user per month" -msgstr "" - -#. js-lingui-id: JIwDAd -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "+$7000/org per month" -msgstr "" - -#. js-lingui-id: yVr18d -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" - -#. js-lingui-id: iK+ikF -#: src/sections/trusted-by/trusted-by.tsx -msgid "+10k others" -msgstr "+10k autres" - -#. js-lingui-id: nRtVCK -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"+20% of net spend\n" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" - -#. js-lingui-id: BmAWVq -#: src/platform/releases/release-notes.tsx -msgid "<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management." -msgstr "" - -#. js-lingui-id: pQcyVv -#: src/platform/releases/release-notes.tsx -msgid "<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\"No Value\" Column: Cards that are not assigned to a specific value will now appear in a \"No Value\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked." -msgstr "" - -#. js-lingui-id: cCqojY -#: src/platform/releases/release-notes.tsx -msgid "<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access." -msgstr "" - -#. js-lingui-id: be30i9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$0" -msgstr "" - -#. js-lingui-id: 6inRXo -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"$1/orchestration run/org\n" -"+$75/user per month\n" -"Switch to enterprise!" -msgstr "" - -#. js-lingui-id: EkIZkY -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$19" -msgstr "" - -#. js-lingui-id: 8r6DgO -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "$9" -msgstr "" - -#. js-lingui-id: EHNAf2 -#: src/case-studies/case-study-catalog.ts -msgid "1 click" -msgstr "" - -#. js-lingui-id: qvNspm -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "1‑800‑YES‑SOFTWARE" -msgstr "" - -#. js-lingui-id: 6WQdu8 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "100 per minute" -msgstr "" - -#. js-lingui-id: uuKUqZ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"11 permissions\n" -"groups" -msgstr "" - -#. js-lingui-id: 2szX5S -#: src/partner-application/partner-application-copy.ts -msgid "150" -msgstr "" - -#. js-lingui-id: 9ntyY8 -#: src/case-studies/case-study-catalog.ts -msgid "150 hrs" -msgstr "" - -#. js-lingui-id: 2z1Znr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "2 years contract" -msgstr "" - -#. js-lingui-id: l6Vx4q -#: src/case-studies/case-study-catalog.ts -msgid "2,000+" -msgstr "" - -#. js-lingui-id: FKcV/y -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "2025" -msgstr "" - -#. js-lingui-id: PJgfBS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "3" -msgstr "" - -#. js-lingui-id: BL47wE -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"3 2 years contract\n" -"-33% off" -msgstr "" - -#. js-lingui-id: /jgC+9 -#: src/case-studies/case-study-catalog.ts -msgid "3 product lines" -msgstr "" - -#. js-lingui-id: 7SJhyh -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "30+" -msgstr "" - -#. js-lingui-id: Pdl2UE -#: src/case-studies/case-study-catalog.ts -msgid "4 tools" -msgstr "" - -#. js-lingui-id: 2ScEtE -#: src/sections/pricing-plans/plans-data.ts -msgid "5 workflow credits/month included" -msgstr "" - -#. js-lingui-id: hIKxCy -#: src/partner-application/partner-application-copy.ts -msgid "5,000" -msgstr "" - -#. js-lingui-id: Z2TH0F -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "50 per minute" -msgstr "" - -#. js-lingui-id: CiRGZ8 -#: src/sections/pricing-plans/plans-data.ts -msgid "50 workflow credits/year included" -msgstr "" - -#. js-lingui-id: tZvajW -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "6 workflows" -msgstr "" - -#. js-lingui-id: fHxYPM -#: src/case-studies/case-study-catalog.ts -msgid "90%+" -msgstr "" - -#. js-lingui-id: u6Xxdi -#: src/case-studies/case-study-stories.ts -msgid "A business that does not fit a *template*" -msgstr "" - -#. js-lingui-id: NLSM5L -#: src/case-studies/case-study-stories.ts -msgid "A business that does not fit a template" -msgstr "" - -#. js-lingui-id: SR9TmK -#: src/sections/product-hero/product-hero.tsx -msgid "A CRM for teams that *move fast*" -msgstr "" - -#. js-lingui-id: MXRINg -#: src/case-studies/case-study-stories.ts -msgid "" -"A CRM that\n" -"*grows* with you" -msgstr "" - -#. js-lingui-id: diWAWP -#: src/case-studies/case-study-catalog.ts -msgid "A CRM that grows with you" -msgstr "" - -#. js-lingui-id: och6cp -#: src/case-studies/case-study-stories.ts -msgid "A CRM that grows with you | NetZero & Twenty" -msgstr "" - -#. js-lingui-id: N3qsQD -#: src/case-studies/case-study-stories.ts -msgid "" -"A CRM they\n" -"*actually own*" -msgstr "" - -#. js-lingui-id: muZzEA -#: src/case-studies/case-study-catalog.ts -msgid "A CRM they actually own" -msgstr "" - -#. js-lingui-id: HSyZ9R -#: src/sections/problem/problem.tsx -msgid "A custom CRM gives your org an edge, *but building one* comes with *tradeoffs*" -msgstr "Un CRM sur mesure donne un avantage à votre organisation, *mais en construire un* implique des *compromis*" - -#. js-lingui-id: Ll7vsZ -#: src/sections/product-demo/product-demo.tsx -msgid "A demo worth a *thousand words*" -msgstr "" - -#. js-lingui-id: uNIo/j -#: src/sections/three-cards/product-three-cards.tsx -msgid "A modern CRM with *an intuitive interface*" -msgstr "" - -#. js-lingui-id: sDJ4rX -#: src/platform/releases/release-notes.tsx -msgid "A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views." -msgstr "" - -#. js-lingui-id: aYUQpm -#: src/platform/releases/release-notes.tsx -msgid "A new maintenance mode helps admins pause workspace changes during sensitive operations." -msgstr "" - -#. js-lingui-id: P5BDuh -#: src/case-studies/case-study-stories.ts -msgid "A platform ready to *grow*" -msgstr "" - -#. js-lingui-id: rxMguZ -#: src/case-studies/case-study-stories.ts -msgid "A platform ready to grow" -msgstr "" - -#. js-lingui-id: vbJW8I -#: src/case-studies/case-study-stories.ts -msgid "" -"A real estate agency on WhatsApp built a\n" -"*CRM* around it" -msgstr "" - -#. js-lingui-id: hwoGni -#: src/case-studies/case-study-catalog.ts -msgid "A real estate agency on WhatsApp built a CRM around it" -msgstr "" - -#. js-lingui-id: WjUlJr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "A retro theme as a paid add-on is somehow the most believable part." -msgstr "" - -#. js-lingui-id: r9Msiv -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \"I want this\" and \"it's live\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption." -msgstr "" - -#. js-lingui-id: H1lDvm -#: src/platform/releases/release-notes.tsx -msgid "Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update." -msgstr "" - -#. js-lingui-id: c0RR2h -#: src/case-studies/case-study-stories.ts -msgid "About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together." -msgstr "" - -#. js-lingui-id: 41o3VS -#: src/case-studies/case-study-catalog.ts -msgid "AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control." -msgstr "" - -#. js-lingui-id: TuJiQF -#: src/sections/three-cards/three-cards.data.ts -#: src/case-studies/case-study-stories.ts -msgid "AC&T Education Migration" -msgstr "AC&T Education Migration" - -#. js-lingui-id: yHUdh6 -#: src/case-studies/case-study-stories.ts -msgid "AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export." -msgstr "" - -#. js-lingui-id: MPzy5R -#: src/sections/three-cards/three-cards.data.ts -msgid "AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%." -msgstr "AC&T est passé à une instance Twenty auto-hébergée : aucun risque fournisseur, aucune migration forcée, et des coûts CRM réduits de plus de 90 %." - -#. js-lingui-id: J+A83M -#: src/sections/helped/helped.data.ts -msgid "AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%." -msgstr "AC&T a remplacé un CRM propriétaire abandonné par Twenty auto-hébergé et réduit ses coûts CRM de plus de 90 %." - -#. js-lingui-id: Kqfsda -#: src/platform/routing/static-website-routes.ts -msgid "Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance." -msgstr "" - -#. js-lingui-id: muhZ+X -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activating your enterprise license…" -msgstr "" - -#. js-lingui-id: +cggij -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activation failed. Please try again." -msgstr "" - -#. js-lingui-id: trCWSt -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Activation response was incomplete." -msgstr "" - -#. js-lingui-id: Yyn/dP -#: src/partners-marketplace/active-filter-pills.tsx -msgid "Active filters" -msgstr "" - -#. js-lingui-id: iNSn2+ -#: src/platform/releases/release-notes.tsx -msgid "Add files directly to records so documents, screenshots, and other assets stay attached to the right work." -msgstr "" - -#. js-lingui-id: x0pZJy -#: src/platform/releases/release-notes.tsx -msgid "Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define." -msgstr "" - -#. js-lingui-id: woOp+c -#: src/sections/stepper/product-stepper-data.ts -msgid "Add objects and fields" -msgstr "" - -#. js-lingui-id: ZuoQMi -#: src/platform/releases/release-notes.tsx -msgid "Add records to filtered views" -msgstr "" - -#. js-lingui-id: l3+wiC -#: src/platform/releases/release-notes.tsx -msgid "Add rich text directly inside layouts with the new dedicated field widget." -msgstr "" - -#. js-lingui-id: ced+/c -#: src/platform/releases/release-notes.tsx -msgid "Add Several emails for one contact" -msgstr "" - -#. js-lingui-id: Y2K3rp -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Add-ons" -msgstr "" - -#. js-lingui-id: U4glZw -#: src/platform/releases/release-notes.tsx -msgid "Added \"Group By\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu." -msgstr "" - -#. js-lingui-id: 6u4D5m -#: src/platform/releases/release-notes.tsx -msgid "Address Field Type" -msgstr "" - -#. js-lingui-id: g1in8j -#: src/platform/releases/release-notes.tsx -msgid "Admin Panel" -msgstr "" - -#. js-lingui-id: Op7nVF -#: src/case-studies/case-study-stories.ts -msgid "Adoption" -msgstr "" - -#. js-lingui-id: SUk0w7 -#: src/platform/releases/release-notes.tsx -msgid "Advanced Email and Calendar Settings" -msgstr "" - -#. js-lingui-id: dePx/O -#: src/platform/releases/release-notes.tsx -msgid "Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction." -msgstr "" - -#. js-lingui-id: c0acMS -#: src/platform/releases/release-notes.tsx -msgid "Advanced filters" -msgstr "" - -#. js-lingui-id: JiIKww -#: src/platform/releases/release-notes.tsx -msgid "Advanced Settings" -msgstr "" - -#. js-lingui-id: 2050Pj -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Advisory & Discovery" -msgstr "" - -#. js-lingui-id: QjSFuI -#: src/partner-application/data/partner-country-options.ts -msgid "Afghanistan 🇦🇫" -msgstr "" - -#. js-lingui-id: StqEz0 -#: src/partners-marketplace/served-geo-labels.ts -msgid "Africa" -msgstr "" - -#. js-lingui-id: NmHsVh -#: src/partner-application/data/partner-team-type-options.ts -msgid "Agency" -msgstr "" - -#. js-lingui-id: vZKKhf -#: src/sections/product-feature/feature-tiles.ts -msgid "Aggregate, bar, line, and pie widgets" -msgstr "" - -#. js-lingui-id: HURF9k -#: src/platform/releases/release-notes.tsx -msgid "Aggregates" -msgstr "" - -#. js-lingui-id: rp2omj -#: src/case-studies/case-study-catalog.ts -msgid "Agribusiness" -msgstr "" - -#. js-lingui-id: jiGK6+ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "AI (Einstein)" -msgstr "" - -#. js-lingui-id: aUn7Ps -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "AI & Automations" -msgstr "" - -#. js-lingui-id: HbXHSp -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "AI agents" -msgstr "" - -#. js-lingui-id: WGXwzu -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain." -msgstr "" - -#. js-lingui-id: Rsxdfy -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "AI Agents with custom skills" -msgstr "" - -#. js-lingui-id: JHi+LN -#: src/platform/releases/release-notes.tsx -msgid "AI agents, chats, and MCP" -msgstr "" - -#. js-lingui-id: n2fhCy -#: src/platform/releases/release-notes.tsx -msgid "AI chat" -msgstr "" - -#. js-lingui-id: YeA2Ox -#: src/platform/releases/release-notes.tsx -msgid "AI Chat is easier to use with a cleaner experience and clearer model choices." -msgstr "" - -#. js-lingui-id: TfV/y9 -#: src/sections/three-cards/product-three-cards-data.ts -msgid "AI chat, settings, and records in a side panels for fast, single-screen access." -msgstr "" - -#. js-lingui-id: R+bwFB -#: src/sections/three-cards/three-cards.data.ts -msgid "AI for rapid iterations" -msgstr "L'IA pour des itérations rapides" - -#. js-lingui-id: svfUwH -#: src/case-studies/case-study-stories.ts -msgid "AI in the *migration workflow*" -msgstr "" - -#. js-lingui-id: A6v5aI -#: src/case-studies/case-study-stories.ts -msgid "AI in the migration workflow" -msgstr "" - -#. js-lingui-id: t97j+F -#: src/case-studies/case-study-catalog.ts -msgid "AI-assisted" -msgstr "" - -#. js-lingui-id: 7xlBwk -#: src/partner-application/data/partner-country-options.ts -msgid "Albania 🇦🇱" -msgstr "" - -#. js-lingui-id: EszGq4 -#: src/partner-application/data/partner-country-options.ts -msgid "Algeria 🇩🇿" -msgstr "" - -#. js-lingui-id: LIGwFL -#: src/sections/three-cards/three-cards.data.ts -#: src/case-studies/case-study-stories.ts -msgid "Alternative Partners" -msgstr "Alternative Partners" - -#. js-lingui-id: GDVvyT -#: src/case-studies/case-study-stories.ts -msgid "Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers." -msgstr "" - -#. js-lingui-id: CCrRuT -#: src/case-studies/case-study-catalog.ts -msgid "Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work." -msgstr "" - -#. js-lingui-id: UIu18Y -#: src/sections/three-cards/three-cards.data.ts -msgid "Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee." -msgstr "Alternative Partners a utilisé l'IA agentique pour compresser des semaines de migration Salesforce en un travail qu'une seule personne pouvait superviser." - -#. js-lingui-id: +BHPrF -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "always" -msgstr "" - -#. js-lingui-id: iFLhqi -#: src/sections/testimonials/testimonials.data.ts -msgid "Amrendra Pratap Singh" -msgstr "Amrendra Pratap Singh" - -#. js-lingui-id: Sbiivs -#: src/partner-application/data/partner-country-options.ts -msgid "Andorra 🇦🇩" -msgstr "" - -#. js-lingui-id: Uv5eaJ -#: src/partner-application/data/partner-country-options.ts -msgid "Angola 🇦🇴" -msgstr "" - -#. js-lingui-id: qKANz3 -#: src/partner-application/data/partner-country-options.ts -msgid "Antigua & Barbuda 🇦🇬" -msgstr "" - -#. js-lingui-id: BfeCSx -#: src/platform/releases/release-notes.tsx -msgid "Any Field filter" -msgstr "" - -#. js-lingui-id: aGCcXe -#: src/sections/faq/faq.tsx -msgid "Any Questions?" -msgstr "Des questions ?" - -#. js-lingui-id: lgSvgF -#: src/partner-application/partner-application-copy.ts -msgid "Anything else we should know?" -msgstr "" - -#. js-lingui-id: pkMjbA -#: src/partner-application/data/partner-scope-options.ts -msgid "Anything that needs a developer." -msgstr "" - -#. js-lingui-id: dYZUP3 -#: src/partner-application/data/partner-scope-options.ts -msgid "Anything that needs devops skills." -msgstr "" - -#. js-lingui-id: AfiWqP -#: src/partners-marketplace/served-geo-labels.ts -msgid "APAC" -msgstr "" - -#. js-lingui-id: /AMVjF -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "APEX tutorials" -msgstr "" - -#. js-lingui-id: yKBF3l -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "API access" -msgstr "" - -#. js-lingui-id: 30KnZB -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "API calls" -msgstr "" - -#. js-lingui-id: 42FQ3y -#: src/case-studies/case-study-catalog.ts -msgid "API-first" -msgstr "" - -#. js-lingui-id: azQMHP -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "APIs are extra. Simplicity has a price." -msgstr "" - -#. js-lingui-id: MqJvvH -#: src/sections/menu/menu.data.ts -msgid "APIs, SDKs and webhooks to extend Twenty and ship apps on top of your CRM data." -msgstr "APIs, SDKs et webhooks pour étendre Twenty et livrer des applications sur vos données CRM." - -#. js-lingui-id: k8I7/G -#: src/partner-application/partner-application-copy.ts -msgid "" -"Apply to build\n" -"*the future of CRM*" -msgstr "" - -#. js-lingui-id: LJCDxT -#: src/platform/routing/static-website-routes.ts -msgid "Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM." -msgstr "" - -#. js-lingui-id: 8HV3WN -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Arabic" -msgstr "" - -#. js-lingui-id: uicv6Z -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "Architecture" -msgstr "" - -#. js-lingui-id: fT9xVz -#: src/partner-application/data/partner-country-options.ts -msgid "Argentina 🇦🇷" -msgstr "" - -#. js-lingui-id: 3KxGep -#: src/partner-application/data/partner-country-options.ts -msgid "Armenia 🇦🇲" -msgstr "" - -#. js-lingui-id: S+Q+1d -#: src/sections/product-hero/product-hero.tsx -msgid "Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams." -msgstr "" - -#. js-lingui-id: 7UGCGX -#: src/sections/three-cards/three-cards.tsx -msgid "Assemble, iterate and adapt a robust CRM, *that's quick to flex*" -msgstr "Assemblez, itérez et adaptez un CRM robuste, *rapide à faire évoluer*" - -#. js-lingui-id: v7zTZl -#: src/sections/product-feature/feature-tiles.ts -msgid "Assign owners and due dates" -msgstr "" - -#. js-lingui-id: awzjg/ -#: src/platform/releases/release-notes.tsx -msgid "Attachment Visualizer" -msgstr "" - -#. js-lingui-id: fxL/Km -#: src/sections/product-feature/feature-tiles.ts -msgid "Attachments without the chaos." -msgstr "" - -#. js-lingui-id: y2W2Hg -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Audit logs" -msgstr "" - -#. js-lingui-id: tw0/s1 -#: src/partner-application/data/partner-country-options.ts -msgid "Australia 🇦🇺" -msgstr "" - -#. js-lingui-id: 4cf5s+ -#: src/partner-application/data/partner-country-options.ts -msgid "Austria 🇦🇹" -msgstr "" - -#. js-lingui-id: FFv0Vh -#: src/sections/stepper/product-stepper-data.ts -msgid "Automation" -msgstr "" - -#. js-lingui-id: SJ7WSP -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Available on YouTube!" -msgstr "" - -#. js-lingui-id: 8d+jRc -#: src/partner-application/data/partner-country-options.ts -msgid "Azerbaijan 🇦🇿" -msgstr "" - -#. js-lingui-id: iH8pgl -#: src/sections/case-study-detail/case-study-hero.tsx -msgid "Back" -msgstr "" - -#. js-lingui-id: wIoAQo -#: src/partner-application/data/partner-country-options.ts -msgid "Bahamas 🇧🇸" -msgstr "" - -#. js-lingui-id: Rhju1T -#: src/partner-application/data/partner-country-options.ts -msgid "Bahrain 🇧🇭" -msgstr "" - -#. js-lingui-id: LxzgmZ -#: src/partner-application/data/partner-country-options.ts -msgid "Bangladesh 🇧🇩" -msgstr "" - -#. js-lingui-id: rtcPS0 -#: src/partner-application/data/partner-country-options.ts -msgid "Barbados 🇧🇧" -msgstr "" - -#. js-lingui-id: RownlY -#: src/partners-marketplace/partner-facts-list.tsx -msgid "Based in" -msgstr "" - -#. js-lingui-id: jQLfIW -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Because apparently privacy feels more premium with a surcharge." -msgstr "" - -#. js-lingui-id: qEQv1F -#: src/case-studies/case-study-stories.ts -msgid "Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform." -msgstr "" - -#. js-lingui-id: uIG0OH -#: src/case-studies/case-study-stories.ts -msgid "Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites." -msgstr "" - -#. js-lingui-id: JGM+JO -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Because true orchestration means putting a dollar sign on every dramatic entrance." -msgstr "" - -#. js-lingui-id: Z7U/Og -#: src/case-studies/case-study-stories.ts -msgid "Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected." -msgstr "" - -#. js-lingui-id: kWm0dC -#: src/sections/partner-hero/partner-hero.tsx -msgid "" -"Become\n" -"*our partner*" -msgstr "" - -#. js-lingui-id: PKMHNe -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "become a genius!" -msgstr "" - -#. js-lingui-id: 6ZCRfT -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/partner-hero/partner-hero.tsx -msgid "Become a partner" -msgstr "" - -#. js-lingui-id: j+1dcz -#: src/platform/routing/static-website-routes.ts -msgid "Become a Twenty Partner — Apply" -msgstr "" - -#. js-lingui-id: 83Wi6G -#: src/sections/stepper/stepper.data.ts -msgid "Begin with production-grade *building blocks*" -msgstr "Commencez avec des *briques* de niveau production" - -#. js-lingui-id: 0TCnEf -#: src/partner-application/data/partner-country-options.ts -msgid "Belarus 🇧🇾" -msgstr "" - -#. js-lingui-id: qblg4t -#: src/partner-application/data/partner-country-options.ts -msgid "Belgium 🇧🇪" -msgstr "" - -#. js-lingui-id: pSF7xM -#: src/partner-application/data/partner-country-options.ts -msgid "Belize 🇧🇿" -msgstr "" - -#. js-lingui-id: Hds3Bq -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Bengali" -msgstr "" - -#. js-lingui-id: cTWkw3 -#: src/partner-application/data/partner-country-options.ts -msgid "Benin 🇧🇯" -msgstr "" - -#. js-lingui-id: SYfuGP -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Benjamin Reynolds" -msgstr "" - -#. js-lingui-id: YfjrMq -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Bertrams" -msgstr "" - -#. js-lingui-id: mzTjnf -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Better than Liquid Glass!" -msgstr "" - -#. js-lingui-id: T1oJwH -#: src/case-studies/case-study-stories.ts -msgid "Beyond *internal rollout*" -msgstr "" - -#. js-lingui-id: OPnz/X -#: src/partner-application/data/partner-country-options.ts -msgid "Bhutan 🇧🇹" -msgstr "" - -#. js-lingui-id: 8tzR0k -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Billing period" -msgstr "" - -#. js-lingui-id: BpyJwa -#: src/sections/menu/menu.data.ts -msgid "Blue developer illustration with branching arrows" -msgstr "Illustration développeur bleue avec des flèches ramifiées" - -#. js-lingui-id: TVJDFA -#: src/partner-application/data/partner-country-options.ts -msgid "Bolivia 🇧🇴" -msgstr "" - -#. js-lingui-id: MkvsWx -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Book a call" -msgstr "" - -#. js-lingui-id: Wzdd8u -#: src/partner-application/data/partner-country-options.ts -msgid "Bosnia & Herzegovina 🇧🇦" -msgstr "" - -#. js-lingui-id: wtNsrt -#: src/partner-application/data/partner-country-options.ts -msgid "Botswana 🇧🇼" -msgstr "" - -#. js-lingui-id: yCaNfF -#: src/partner-application/data/partner-country-options.ts -msgid "Brazil 🇧🇷" -msgstr "" - -#. js-lingui-id: bmk2dj -#: src/platform/routing/static-website-routes.ts -msgid "Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models." -msgstr "" - -#. js-lingui-id: VX4eI/ -#: src/partner-application/data/partner-country-options.ts -msgid "Brunei 🇧🇳" -msgstr "" - -#. js-lingui-id: s4FVHa -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -msgid "" -"Build a CRM your\n" -"competitors *can't buy.*" -msgstr "" - -#. js-lingui-id: sbr0X/ -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Build a dashboard of pipeline by stage" -msgstr "" - -#. js-lingui-id: uetyzD -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Build a pipeline board grouped by stage" -msgstr "" - -#. js-lingui-id: 3+uH0v -#: src/platform/releases/release-notes.tsx -msgid "Build an app" -msgstr "" - -#. js-lingui-id: Utc5RF -#: src/sections/product-feature/feature-tiles.ts -msgid "Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads." -msgstr "" - -#. js-lingui-id: rdvFK9 -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Build it in an afternoon. *AI made the gap that small.*" -msgstr "" - -#. js-lingui-id: e1u+Zh -#: src/sections/menu/menu.data.ts -msgid "Build on an open platform" -msgstr "Construisez sur une plateforme ouverte" - -#. js-lingui-id: yEKs3h -#: src/platform/releases/release-notes.tsx -msgid "Build with your favorite tools" -msgstr "" - -#. js-lingui-id: 2FDUkV -#: src/sections/home-hero/home-hero.tsx -msgid "Build your Enterprise CRM *at AI Speed*" -msgstr "Construisez votre CRM d'entreprise *à la vitesse de l'IA*" - -#. js-lingui-id: SoAKmY -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Built for speed" -msgstr "" - -#. js-lingui-id: sdItv6 -#: src/partner-application/data/partner-country-options.ts -msgid "Bulgaria 🇧🇬" -msgstr "" - -#. js-lingui-id: Lze0QH -#: src/platform/releases/release-notes.tsx -msgid "Bulk Deletion" -msgstr "" - -#. js-lingui-id: dNnRlc -#: src/partner-application/data/partner-country-options.ts -msgid "Burkina Faso 🇧🇫" -msgstr "" - -#. js-lingui-id: j8RGrG -#: src/case-studies/case-study-stories.ts -msgid "Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty" -msgstr "" - -#. js-lingui-id: jtdtLa -#: src/partner-application/data/partner-country-options.ts -msgid "Burundi 🇧🇮" -msgstr "" - -#. js-lingui-id: L40Ae7 -#: src/partner-application/partner-application-copy.ts -msgid "Calendar / booking link" -msgstr "" - -#. js-lingui-id: 6DqzR/ -#: src/platform/releases/release-notes.tsx -msgid "Calendar View for Objects" -msgstr "" - -#. js-lingui-id: 4yFkf9 -#: src/partner-application/data/partner-country-options.ts -msgid "Cambodia 🇰🇭" -msgstr "" - -#. js-lingui-id: AvRzYu -#: src/partner-application/data/partner-country-options.ts -msgid "Cameroon 🇨🇲" -msgstr "" - -#. js-lingui-id: wCALve -#: src/sections/faq/faq.data.ts -msgid "Can developers extend Twenty with code?" -msgstr "Les développeurs peuvent-ils étendre Twenty avec du code ?" - -#. js-lingui-id: 6mytgb -#: src/sections/faq/faq.data.ts -msgid "Can I migrate from Salesforce or HubSpot?" -msgstr "Puis-je migrer depuis Salesforce ou HubSpot ?" - -#. js-lingui-id: nEOTNi -#: src/partner-application/data/partner-country-options.ts -msgid "Canada 🇨🇦" -msgstr "" - -#. js-lingui-id: hRO6uK -#: src/partner-application/data/partner-country-options.ts -msgid "Cape Verde 🇨🇻" -msgstr "" - -#. js-lingui-id: qLBo3s -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "carousel" -msgstr "carrousel" - -#. js-lingui-id: C6wh0T -#: src/sections/case-study-catalog/case-study-card.tsx -msgid "Case" -msgstr "" - -#. js-lingui-id: M1RLfx -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Catalan" -msgstr "" - -#. js-lingui-id: NUrY9o -#: src/partners-marketplace/partner-facts-list.tsx -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Categories" -msgstr "" - -#. js-lingui-id: dBApoS -#: src/partner-application/data/partner-country-options.ts -msgid "Central African Republic 🇨🇫" -msgstr "" - -#. js-lingui-id: iI3Dq9 -#: src/partner-application/data/partner-country-options.ts -msgid "Chad 🇹🇩" -msgstr "" - -#. js-lingui-id: +DEogc -#: src/sections/footer/locale-switcher.tsx -msgid "Change language" -msgstr "Changer de langue" - -#. js-lingui-id: 2D9CbR -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Check more add-ons" -msgstr "" - -#. js-lingui-id: 2BY3So -#: src/partner-application/data/partner-country-options.ts -msgid "Chile 🇨🇱" -msgstr "" - -#. js-lingui-id: zG6t8U -#: src/partner-application/data/partner-country-options.ts -msgid "China 🇨🇳" -msgstr "" - -#. js-lingui-id: h1IXFK -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Chinese" -msgstr "" - -#. js-lingui-id: s2oWpP -#: src/sections/footer/locale-switcher.tsx -msgid "Choose a language" -msgstr "Choisir une langue" - -#. js-lingui-id: AZNxzv -#: src/platform/releases/release-notes.tsx -msgid "Choose a role directly when inviting a teammate to a workspace." -msgstr "" - -#. js-lingui-id: geiXTM -#: src/platform/releases/release-notes.tsx -msgid "Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need." -msgstr "" - -#. js-lingui-id: TNVfAe -#: src/platform/releases/release-notes.tsx -msgid "Choose how to display dates in any field using a universal Unicode date format that best suits your use case." -msgstr "" - -#. js-lingui-id: 3wV73y -#: src/partner-application/partner-application-copy.ts -msgid "City" -msgstr "" - -#. js-lingui-id: ZbCD7v -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Classic never dies. It just gets extended one more time." -msgstr "" - -#. js-lingui-id: u8JHrO -#: src/partners-marketplace/filter-bar.tsx -#: src/partners-marketplace/empty-state.tsx -msgid "Clear filters" -msgstr "" - -#. js-lingui-id: yz7wBu -#: src/app-preview/stage/traffic-lights.tsx -msgid "Close" -msgstr "" - -#. js-lingui-id: cu6iol -#: src/sections/pricing-salesfarce/salesfarce-wrong-choice-popup.tsx -msgid "Close dialog" -msgstr "" - -#. js-lingui-id: vcpc5o -#: src/sections/menu/menu.tsx -msgid "Close menu" -msgstr "Fermer le menu" - -#. js-lingui-id: oLsrmd -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -msgid "Close pricing window" -msgstr "" - -#. js-lingui-id: R7zx6E -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "cloud" -msgstr "" - -#. js-lingui-id: L/LPQZ -#: src/sections/faq/faq.data.ts -msgid "Cloud Pro is $9/user/month (yearly). Organization is $19/user/month and unlocks SSO and row-level permissions for teams that need finer access control." -msgstr "Cloud Pro coûte 9 $/utilisateur/mois (facturation annuelle). Organization, à 19 $/utilisateur/mois, débloque le SSO et les permissions au niveau des lignes pour les équipes qui exigent un contrôle d'accès plus fin." - -#. js-lingui-id: WYgF8M -#: src/platform/routing/static-website-routes.ts -msgid "Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions." -msgstr "" - -#. js-lingui-id: 1YncLF -#: src/sections/testimonials/testimonials.data.ts -msgid "Co-founder at NetZero" -msgstr "Cofondateur de NetZero" - -#. js-lingui-id: 4QGkvo -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "co-founder of NetZero" -msgstr "" - -#. js-lingui-id: vWaYWP -#: src/case-studies/case-study-catalog.ts -msgid "Co-founder, NetZero" -msgstr "" - -#. js-lingui-id: dcLsG5 -#: src/partner-application/data/partner-country-options.ts -msgid "Colombia 🇨🇴" -msgstr "" - -#. js-lingui-id: b5bnuN -#: src/sections/product-feature/feature-tiles.ts -msgid "Column-to-field mapping (including relations)" -msgstr "" - -#. js-lingui-id: ofoEsM -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Coming soon!" -msgstr "" - -#. js-lingui-id: KGD9Kt -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Commercial license (no AGPL obligations)" -msgstr "" - -#. js-lingui-id: OnPROL -#: src/partner-application/partner-application-copy.ts -msgid "Commercials" -msgstr "" - -#. js-lingui-id: chL5IG -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/menu/menu-social.tsx -msgid "Community" -msgstr "Communauté" - -#. js-lingui-id: 8CLnho -#: src/sections/pricing-plans/plans-data.ts -msgid "Community support" -msgstr "" - -#. js-lingui-id: RxpseA -#: src/partner-application/data/partner-country-options.ts -msgid "Comoros 🇰🇲" -msgstr "" - -#. js-lingui-id: SHjhDC -#: src/partner-application/partner-application-copy.ts -msgid "Company or brand *" -msgstr "" - -#. js-lingui-id: Fkb+LW -#: src/sections/three-cards/three-cards.tsx -msgid "Compose your CRM and internal apps with a single extensibility toolkit." -msgstr "Composez votre CRM et vos applications internes avec une seule boîte à outils d'extensibilité." - -#. js-lingui-id: kD7ZGH -#: src/sections/stepper/stepper.data.ts -msgid "Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation." -msgstr "Composez votre CRM et vos applications internes avec une seule boîte à outils d'extensibilité. Modèle de données, mise en page et automatisation." - -#. js-lingui-id: 2DQw7/ -#: src/partner-application/data/partner-country-options.ts -msgid "Congo 🇨🇬" -msgstr "" - -#. js-lingui-id: iSLIjg -#: src/sections/footer/footer.data.ts -msgid "Connect" -msgstr "Contact" - -#. js-lingui-id: 90KBr0 -#: src/sections/product-feature/feature-tiles.ts -msgid "Connect Google or Microsoft accounts" -msgstr "" - -#. js-lingui-id: xgrBCK -#: src/sections/product-feature/feature-tiles.ts -msgid "Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically." -msgstr "" - -#. js-lingui-id: dGwMkb -#: src/platform/releases/release-notes.tsx -msgid "Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team." -msgstr "" - -#. js-lingui-id: MVrQxI -#: src/case-studies/case-study-catalog.ts -msgid "Connected via API" -msgstr "" - -#. js-lingui-id: cfAG43 -#: src/case-studies/case-study-catalog.ts -msgid "Consulting" -msgstr "" - -#. js-lingui-id: GsUBlG -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Contact {partnerName}" -msgstr "" - -#. js-lingui-id: Oii3vg -#: src/sections/product-feature/feature-tiles.ts -msgid "Contacts & Companies" -msgstr "" - -#. js-lingui-id: 24qVhV -#: src/sections/product-feature/feature-tiles.ts -msgid "Context lives with the record." -msgstr "" - -#. js-lingui-id: mXovG/ -#: src/sections/stepper/stepper.data.ts -msgid "Continue iteration *without friction*" -msgstr "Poursuivez l'itération *sans friction*" - -#. js-lingui-id: LqyWsJ -#: src/platform/releases/release-notes.tsx -msgid "Contributors now have their very own hall of fame." -msgstr "" - -#. js-lingui-id: qVH+kL -#: src/platform/releases/release-notes.tsx -msgid "Contributors page" -msgstr "" - -#. js-lingui-id: +Uepfb -#: src/case-studies/case-study-stories.ts -msgid "Control" -msgstr "" - -#. js-lingui-id: GplbCP -#: src/case-studies/case-study-stories.ts -msgid "Control without *the overhead*" -msgstr "" - -#. js-lingui-id: wH1xmY -#: src/sections/three-cards/three-cards.data.ts -msgid "Control without drag" -msgstr "Le contrôle sans la lourdeur" - -#. js-lingui-id: Bj7igG -#: src/case-studies/case-study-stories.ts -msgid "Control without the overhead" -msgstr "" - -#. js-lingui-id: PiH3UR -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copied!" -msgstr "" - -#. js-lingui-id: he3ygx -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy" -msgstr "" - -#. js-lingui-id: 7qTWwB -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy the enterprise key above." -msgstr "" - -#. js-lingui-id: PXnj76 -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Copy this key and paste it into your Twenty self-hosted instance settings." -msgstr "" - -#. js-lingui-id: FapWIq -#: src/sections/product-feature/product-feature.tsx -msgid "Core Features" -msgstr "" - -#. js-lingui-id: Al/blj -#: src/partner-application/data/partner-country-options.ts -msgid "Costa Rica 🇨🇷" -msgstr "" - -#. js-lingui-id: 1B8JTc -#: src/case-studies/case-study-stories.ts -msgid "Costs down more than *90%*" -msgstr "" - -#. js-lingui-id: cRA2/z -#: src/partner-application/partner-application-copy.ts -msgid "Country *" -msgstr "" - -#. js-lingui-id: kCu+Rq -#: src/platform/releases/release-notes.tsx -msgid "Create a Kanban view on any object and streamline processes like recruitment or onboarding." -msgstr "" - -#. js-lingui-id: Xn2Nlq -#: src/sections/stepper/product-stepper-data.ts -msgid "Create a workflow" -msgstr "" - -#. js-lingui-id: +kFrvb -#: src/platform/releases/release-notes.tsx -msgid "Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs." -msgstr "" - -#. js-lingui-id: t9znrt -#: src/platform/releases/release-notes.tsx -msgid "Create and organize sidebar items more easily with a cleaner navigation setup." -msgstr "" - -#. js-lingui-id: B9nLrl -#: src/sections/menu/menu.data.ts -msgid "Create apps on Twenty" -msgstr "Créez des applications sur Twenty" - -#. js-lingui-id: yAL7FY -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Create custom apps" -msgstr "" - -#. js-lingui-id: 20ZdFp -#: src/platform/releases/release-notes.tsx -msgid "Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics." -msgstr "" - -#. js-lingui-id: YxktRb -#: src/platform/releases/release-notes.tsx -msgid "Create fields and edit field widgets more directly from record pages." -msgstr "" - -#. js-lingui-id: RRfcjH -#: src/platform/releases/release-notes.tsx -msgid "Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities." -msgstr "" - -#. js-lingui-id: qCRCtk -#: src/platform/releases/release-notes.tsx -msgid "Create more flexible relationships between objects, including more advanced many-to-many setups." -msgstr "" - -#. js-lingui-id: oS1RiS -#: src/sections/product-feature/feature-tiles.ts -msgid "Create tasks from records" -msgstr "" - -#. js-lingui-id: D3S5+x -#: src/sections/product-feature/feature-tiles.ts -msgid "Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context." -msgstr "" - -#. js-lingui-id: egTba/ -#: src/platform/releases/release-notes.tsx -msgid "Created By" -msgstr "" - -#. js-lingui-id: ppNnWO -#: src/platform/releases/release-notes.tsx -msgid "Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields." -msgstr "" - -#. js-lingui-id: NLgmM4 -#: src/partner-application/data/partner-scope-options.ts -msgid "CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection" -msgstr "" - -#. js-lingui-id: Y44Xsf -#: src/case-studies/case-study-stories.ts -msgid "CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again." -msgstr "" - -#. js-lingui-id: wDasLa -#: src/sections/three-cards/three-cards.data.ts -msgid "CRM Engineer" -msgstr "Ingénieur CRM" - -#. js-lingui-id: DqkzNV -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "CRM Engineer, AC&T Education Migration" -msgstr "" - -#. js-lingui-id: b7vNti -#: src/sections/why-twenty-hero/why-twenty-hero.tsx -msgid "CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy." -msgstr "" - -#. js-lingui-id: ntHvtU -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "CRM was a ledger. *AI turned it into an operating system.*" -msgstr "" - -#. js-lingui-id: OACAVp -#: src/partner-application/data/partner-country-options.ts -msgid "Croatia 🇭🇷" -msgstr "" - -#. js-lingui-id: I6FFSA -#: src/sections/product-feature/feature-tiles.ts -msgid "CSV export anytime" -msgstr "" - -#. js-lingui-id: 8RWevB -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "CSV import & export" -msgstr "" - -#. js-lingui-id: s+QiQi -#: src/sections/product-feature/feature-tiles.ts -msgid "CSV import flow" -msgstr "" - -#. js-lingui-id: zyTj4q -#: src/platform/releases/release-notes.tsx -msgid "CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports." -msgstr "" - -#. js-lingui-id: O2UtEV -#: src/partner-application/data/partner-country-options.ts -msgid "Cuba 🇨🇺" -msgstr "" - -#. js-lingui-id: auudI+ -#: src/platform/releases/release-notes.tsx -msgid "Currency Field" -msgstr "" - -#. js-lingui-id: lh6aPn -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom AI models" -msgstr "" - -#. js-lingui-id: OaTurC -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom apps" -msgstr "" - -#. js-lingui-id: TcUCTv -#: src/partner-application/data/partner-scope-options.ts -msgid "Custom Apps · Scripts · AI/agent integrations" -msgstr "" - -#. js-lingui-id: onPW5H -#: src/platform/releases/release-notes.tsx -msgid "Custom date formats" -msgstr "" - -#. js-lingui-id: yBSEtR -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom deal stages for your process" -msgstr "" - -#. js-lingui-id: L+b7SB -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality." -msgstr "" - -#. js-lingui-id: DUnke3 -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Custom Development" -msgstr "" - -#. js-lingui-id: GAD3Dx -#: src/sections/pricing-plans/plans-data.ts -msgid "Custom domain" -msgstr "" - -#. js-lingui-id: Vz1Vq2 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom domain (crm.yourco.com)" -msgstr "" - -#. js-lingui-id: oPwQt4 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom fields" -msgstr "" - -#. js-lingui-id: U1RB/7 -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom fields and relationships" -msgstr "" - -#. js-lingui-id: WGKb6T -#: src/sections/product-feature/feature-tiles.ts -msgid "Custom fields, relationships, and a unified timeline for every contact and company in your workspace." -msgstr "" - -#. js-lingui-id: prIqWa -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom layout" -msgstr "" - -#. js-lingui-id: RuYs9T -#: src/platform/releases/release-notes.tsx -msgid "Custom layouts" -msgstr "" - -#. js-lingui-id: 8skTDV -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom objects" -msgstr "" - -#. js-lingui-id: y5pLQH -#: src/platform/releases/release-notes.tsx -msgid "Custom sidebar" -msgstr "" - -#. js-lingui-id: AbyZbl -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Custom views" -msgstr "" - -#. js-lingui-id: 5xK1jE -#: src/sections/helped/helped-scene.tsx -#: src/sections/case-study-catalog/case-study-catalog-grid.tsx -msgid "Customer stories" -msgstr "Histoires de clients" - -#. js-lingui-id: YjXLAQ -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Customer Stories" -msgstr "" - -#. js-lingui-id: BavWCk -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Customer stories preview" -msgstr "" - -#. js-lingui-id: 0fgCyk -#: src/sections/case-study-detail/case-study-hero.tsx -msgid "Customer story" -msgstr "" - -#. js-lingui-id: zKLqOg -#: src/app/[locale]/(site)/customers/[slug]/page.tsx -msgid "Customer story not found — Twenty" -msgstr "" - -#. js-lingui-id: NihQNk -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Customers" -msgstr "Clients" - -#. js-lingui-id: qqLY+j -#: src/sections/stepper/product-stepper-content.tsx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Customization" -msgstr "" - -#. js-lingui-id: GRfLAg -#: src/case-studies/case-study-catalog.ts -msgid "Customizations" -msgstr "" - -#. js-lingui-id: dy0yuR -#: src/platform/releases/release-notes.tsx -msgid "Customize your sub-domain" -msgstr "" - -#. js-lingui-id: Pj5fGG -#: src/partner-application/data/partner-country-options.ts -msgid "Cyprus 🇨🇾" -msgstr "" - -#. js-lingui-id: w9VTXG -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Czech" -msgstr "" - -#. js-lingui-id: xkuHM6 -#: src/partner-application/data/partner-country-options.ts -msgid "Czech Republic 🇨🇿" -msgstr "" - -#. js-lingui-id: 4RLD4p -#: src/case-studies/case-study-catalog.ts -msgid "Daily messages" -msgstr "" - -#. js-lingui-id: Fo2vDn -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Danish" -msgstr "" - -#. js-lingui-id: aebTao -#: src/platform/releases/release-notes.tsx -msgid "Dashboards in Labs (Beta)" -msgstr "" - -#. js-lingui-id: V0kvgB -#: src/sections/product-feature/feature-tiles.ts -msgid "Data import" -msgstr "" - -#. js-lingui-id: 5cNMFz -#: src/sections/stepper/product-stepper-data.ts -msgid "Data model" -msgstr "" - -#. js-lingui-id: ZEsvS2 -#: src/platform/releases/release-notes.tsx -msgid "Data Model Diagram" -msgstr "" - -#. js-lingui-id: iq2WTm -#: src/partner-application/data/partner-scope-options.ts -msgid "Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations" -msgstr "" - -#. js-lingui-id: dSuMNg -#: src/platform/releases/release-notes.tsx -msgid "Datetime Field" -msgstr "" - -#. js-lingui-id: /TlpVf -#: src/sections/product-feature/feature-tiles.ts -msgid "Deals that move themselves." -msgstr "" - -#. js-lingui-id: H1UtjM -#: src/partner-application/data/partner-country-options.ts -msgid "Denmark 🇩🇰" -msgstr "" - -#. js-lingui-id: tqbpyT -#: src/platform/releases/release-notes.tsx -msgid "Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting." -msgstr "" - -#. js-lingui-id: X5B6sd -#: src/sections/helped/helped-scene.tsx -msgid "Dev teams power company-wide *change with Twenty*" -msgstr "Les équipes dev impulsent *le changement avec Twenty* à l'échelle de l'entreprise" - -#. js-lingui-id: n+SX4g -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Developers" -msgstr "Développeurs" - -#. js-lingui-id: 5atXgh -#: src/platform/releases/release-notes.tsx -msgid "Developers can now take advantage of the new array field type to store non-predefined values." -msgstr "" - -#. js-lingui-id: canH5K -#: src/platform/releases/release-notes.tsx -msgid "Developers can now use webhooks to synchronize customer data updates in real-time across applications." -msgstr "" - -#. js-lingui-id: ohFj56 -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Differentiation now *lives in the code you own.*" -msgstr "" - -#. js-lingui-id: Wuqvfz -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "Director of Digital and Information, Elevate Consulting" -msgstr "Directeur du numérique et de l'information, Elevate Consulting" - -#. js-lingui-id: gW1L7t -#: src/case-studies/case-study-stories.ts -msgid "Director, W3villa Technologies, Partner" -msgstr "" - -#. js-lingui-id: 30qcNY -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "Discord (opens in new tab)" -msgstr "Discord (ouvre un nouvel onglet)" - -#. js-lingui-id: old0Lj -#: src/sections/releases-hero/releases-hero.tsx -msgid "Discover the newest features and improvements in Twenty, the #1 Open Source CRM." -msgstr "" - -#. js-lingui-id: W+b/DF -#: src/sections/menu/menu.data.ts -msgid "Discover what's new" -msgstr "Découvrez les nouveautés" - -#. js-lingui-id: rHLwDO -#: src/partner-application/data/partner-country-options.ts -msgid "Djibouti 🇩🇯" -msgstr "" - -#. js-lingui-id: Zjjbne -#: src/sections/faq/faq.data.ts -msgid "Do I need a developer to customize Twenty?" -msgstr "Faut-il un développeur pour personnaliser Twenty ?" - -#. js-lingui-id: Zx22Ih -#: src/sections/faq/faq.data.ts -msgid "Does Twenty work with Claude, ChatGPT, and Cursor?" -msgstr "Twenty fonctionne-t-il avec Claude, ChatGPT et Cursor ?" - -#. js-lingui-id: bMDnQR -#: src/partner-application/data/partner-country-options.ts -msgid "Dominica 🇩🇲" -msgstr "" - -#. js-lingui-id: ufcRA6 -#: src/partner-application/data/partner-country-options.ts -msgid "Dominican Republic 🇩🇴" -msgstr "" - -#. js-lingui-id: pOLPPB -#: src/sections/stepper/stepper.data.ts -msgid "Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling." -msgstr "Ne restez pas prisonnier de l'écosystème d'un autre. L'expérience développeur de Twenty ressemble à du logiciel normal : installation locale, données réelles, tests en direct et aucun outillage propriétaire." - -#. js-lingui-id: HDR0en -#: src/partner-application/data/partner-country-options.ts -msgid "DR Congo 🇨🇩" -msgstr "" - -#. js-lingui-id: mzedFr -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Draft a workflow for an email sequence" -msgstr "" - -#. js-lingui-id: q7M3jo -#: src/platform/releases/release-notes.tsx -msgid "Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works." -msgstr "" - -#. js-lingui-id: fPma12 -#: src/sections/product-feature/feature-tiles.ts -msgid "Drag-and-drop deals between stages" -msgstr "" - -#. js-lingui-id: KIjvtr -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Dutch" -msgstr "" - -#. js-lingui-id: 6r6pDf -#: src/partner-application/partner-application-copy.ts -msgid "e.g. React, Postgres, n8n…" -msgstr "" - -#. js-lingui-id: a35sCN -#: src/platform/releases/release-notes.tsx -msgid "Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain." -msgstr "" - -#. js-lingui-id: s+5p5k -#: src/platform/releases/release-notes.tsx -msgid "Easier field editing" -msgstr "" - -#. js-lingui-id: nKXMzJ -#: src/platform/releases/release-notes.tsx -msgid "Easier layouts" -msgstr "" - -#. js-lingui-id: hEtClO -#: src/partner-application/data/partner-country-options.ts -msgid "Ecuador 🇪🇨" -msgstr "" - -#. js-lingui-id: 4CJ4xV -#: src/case-studies/case-study-catalog.ts -msgid "EdTech" -msgstr "" - -#. js-lingui-id: aqxYLv -#: src/case-studies/case-study-catalog.ts -msgid "Education" -msgstr "" - -#. js-lingui-id: OAdXUT -#: src/partner-application/data/partner-country-options.ts -msgid "Egypt 🇪🇬" -msgstr "" - -#. js-lingui-id: 2xK+An -#: src/partner-application/data/partner-country-options.ts -msgid "El Salvador 🇸🇻" -msgstr "" - -#. js-lingui-id: 1wTjWx -#: src/case-studies/case-study-stories.ts -msgid "Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth." -msgstr "" - -#. js-lingui-id: 2THY70 -#: src/case-studies/case-study-catalog.ts -msgid "Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data." -msgstr "" - -#. js-lingui-id: wiTeYI -#: src/case-studies/case-study-stories.ts -msgid "Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs." -msgstr "" - -#. js-lingui-id: FNyrb0 -#: src/sections/product-feature/feature-tiles.ts -msgid "Email & Calendar" -msgstr "" - -#. js-lingui-id: jTgK6B -#: src/platform/releases/release-notes.tsx -msgid "Email and calendar Blocklist" -msgstr "" - -#. js-lingui-id: AoN898 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Email and Chat" -msgstr "" - -#. js-lingui-id: rc8HEz -#: src/platform/releases/release-notes.tsx -msgid "Email replies" -msgstr "" - -#. js-lingui-id: ObCvfI -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Email sharing" -msgstr "" - -#. js-lingui-id: 7o9obN -#: src/platform/releases/release-notes.tsx -msgid "Email thread widgets and an inline reply composer make it easier to work directly from messaging records." -msgstr "" - -#. js-lingui-id: hfqiVr -#: src/sections/product-feature/feature-tiles.ts -msgid "Email/calendar activity on each record" -msgstr "" - -#. js-lingui-id: XGd8Wo -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Emails & Calendar" -msgstr "" - -#. js-lingui-id: o4/9l1 -#: src/sections/product-feature/feature-tiles.ts -msgid "Emails and events linked to CRM records" -msgstr "" - -#. js-lingui-id: QOINDn -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "empty" -msgstr "" - -#. js-lingui-id: ZxDrUL -#: src/platform/releases/release-notes.tsx -msgid "Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!" -msgstr "" - -#. js-lingui-id: jkaFcU -#: src/platform/releases/release-notes.tsx -msgid "Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in." -msgstr "" - -#. js-lingui-id: Qpn/bX -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Encrypt your data" -msgstr "" - -#. js-lingui-id: Iy8Gze -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Encryption key rotation" -msgstr "" - -#. js-lingui-id: lYGfRP -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "English" -msgstr "" - -#. js-lingui-id: pNNVhg -#: src/platform/releases/release-notes.tsx -msgid "Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication." -msgstr "" - -#. js-lingui-id: kZ17+i -#: src/platform/releases/release-notes.tsx -msgid "Enhance your data handling capabilities with the addition of four new field types:" -msgstr "" - -#. js-lingui-id: CVqFAV -#: src/platform/releases/release-notes.tsx -msgid "Enhanced Kanban Board" -msgstr "" - -#. js-lingui-id: LKTMHa -#: src/platform/releases/release-notes.tsx -msgid "Enhanced One-to-Many Relations Editing" -msgstr "" - -#. js-lingui-id: ovz6sZ -#: src/platform/releases/release-notes.tsx -msgid "Enhanced Timeline" -msgstr "" - -#. js-lingui-id: Ijh+h+ -#: src/sections/stepper/stepper.data.ts -msgid "Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins." -msgstr "Profitez d'une personnalisation illimitée avec les outils de codage IA que vous aimez déjà. Adaptez votre CRM à la façon dont votre entreprise grandit et gagne." - -#. js-lingui-id: xoqD/n -#: src/partner-application/partner-application-copy.ts -msgid "Enter a valid email address." -msgstr "" - -#. js-lingui-id: /OVUD6 -#: src/partner-application/partner-application-copy.ts -msgid "Enter a valid URL (starting with http:// or https://)." -msgstr "" - -#. js-lingui-id: 87BcPj -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Enterprise *activation*" -msgstr "" - -#. js-lingui-id: NTskGY -#: src/platform/routing/static-website-routes.ts -msgid "Enterprise Activation | Twenty" -msgstr "" - -#. js-lingui-id: 3dQ6zJ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Environments" -msgstr "" - -#. js-lingui-id: c0nqfC -#: src/partner-application/data/partner-country-options.ts -msgid "Equatorial Guinea 🇬🇶" -msgstr "" - -#. js-lingui-id: 4DIpFY -#: src/partner-application/data/partner-country-options.ts -msgid "Eritrea 🇪🇷" -msgstr "" - -#. js-lingui-id: JIhNLR -#: src/partner-application/data/partner-country-options.ts -msgid "Estonia 🇪🇪" -msgstr "" - -#. js-lingui-id: 8yXuJ9 -#: src/partner-application/data/partner-country-options.ts -msgid "Eswatini 🇸🇿" -msgstr "" - -#. js-lingui-id: rktGGp -#: src/partner-application/data/partner-country-options.ts -msgid "Ethiopia 🇪🇹" -msgstr "" - -#. js-lingui-id: rQqP1P -#: src/partners-marketplace/served-geo-labels.ts -msgid "Europe" -msgstr "" - -#. js-lingui-id: IhKZhp -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Even the training material is a feature worth celebrating." -msgstr "" - -#. js-lingui-id: sQP1sF -#: src/platform/routing/static-website-routes.ts -msgid "Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most." -msgstr "" - -#. js-lingui-id: rkZTD7 -#: src/sections/product-feature/feature-tiles.ts -msgid "Every thread, on the right record." -msgstr "" - -#. js-lingui-id: kz/8m8 -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Everything in Pro" -msgstr "" - -#. js-lingui-id: zoNk7e -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Everything updates in real time, with AI chat always ready to help you move faster." -msgstr "Tout se met à jour en temps réel, avec un chat IA toujours prêt à vous faire avancer plus vite." - -#. js-lingui-id: /g9UKY -#: src/sections/product-feature/product-feature.tsx -msgid "Everything you need, *out of the box*" -msgstr "" - -#. js-lingui-id: 2NGXKo -#: src/platform/releases/release-notes.tsx -msgid "Expanded support for 30+ languages, so users can navigate and use the software in their preferred language." -msgstr "" - -#. js-lingui-id: 14xdUh -#: src/platform/releases/release-notes.tsx -msgid "Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization." -msgstr "" - -#. js-lingui-id: 57gG1f -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Experience enterprise-grade granularity, starting with an 11th permission." -msgstr "" - -#. js-lingui-id: uZRQi+ -#: src/partner-application/partner-application-copy.ts -msgid "Expertise & experience" -msgstr "" - -#. js-lingui-id: JTM5zS -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Explore customer stories" -msgstr "" - -#. js-lingui-id: weFouS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Extended run!" -msgstr "" - -#. js-lingui-id: tX4pRm -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Failed to activate enterprise key. Please try again." -msgstr "" - -#. js-lingui-id: akLvep -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Familiar, modern interface" -msgstr "Une interface familière et moderne" - -#. js-lingui-id: gKNP7S -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Farsi" -msgstr "" - -#. js-lingui-id: abO45l -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Fast path to action" -msgstr "Un chemin rapide vers l'action" - -#. js-lingui-id: idFRAo -#: src/platform/releases/release-notes.tsx -msgid "Faster field setup" -msgstr "" - -#. js-lingui-id: 3qy0z4 -#: src/platform/releases/release-notes.tsx -msgid "Favorites now live in the navigation menu, making the sidebar easier to organize and customize." -msgstr "" - -#. js-lingui-id: JrTb6F -#: src/platform/releases/release-notes.tsx -msgid "Favorites Views and Favorites Folders" -msgstr "" - -#. js-lingui-id: +LREeu -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "feature" -msgstr "" - -#. js-lingui-id: hXRm6J -#: src/platform/releases/release-notes.tsx -msgid "Field Level Permission" -msgstr "" - -#. js-lingui-id: 3Y3//3 -#: src/platform/releases/release-notes.tsx -msgid "Field widgets" -msgstr "" - -#. js-lingui-id: QDxnW/ -#: src/platform/releases/release-notes.tsx -msgid "Field widgets are easier to configure directly from the page where you use them." -msgstr "" - -#. js-lingui-id: 5SV9rS -#: src/platform/releases/release-notes.tsx -msgid "Field widgets now support more relation types, so custom layouts work better across more objects." -msgstr "" - -#. js-lingui-id: e6BgMV -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Field-level permissions" -msgstr "" - -#. js-lingui-id: z+q1Th -#: src/partner-application/data/partner-country-options.ts -msgid "Fiji 🇫🇯" -msgstr "" - -#. js-lingui-id: sER+bs -#: src/sections/product-feature/feature-tiles.ts -msgid "Files" -msgstr "" - -#. js-lingui-id: jxbpA9 -#: src/platform/releases/release-notes.tsx -msgid "Files in records" -msgstr "" - -#. js-lingui-id: 1t0xRH -#: src/platform/releases/release-notes.tsx -msgid "Filter by Multi-Select" -msgstr "" - -#. js-lingui-id: bOidm7 -#: src/partners-marketplace/filter-bar.tsx -msgid "Filter partners" -msgstr "" - -#. js-lingui-id: kUUNrw -#: src/platform/releases/release-notes.tsx -msgid "Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company." -msgstr "" - -#. js-lingui-id: iabLgo -#: src/sections/product-feature/feature-tiles.ts -msgid "Filtered metrics from any object" -msgstr "" - -#. js-lingui-id: sRUAXp -#: src/platform/routing/static-website-routes.ts -msgid "Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us." -msgstr "" - -#. js-lingui-id: TJ7HQl -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/partner-hero/partner-hero.tsx -msgid "Find a partner" -msgstr "" - -#. js-lingui-id: MD032e -#: src/sections/menu/menu.data.ts -msgid "Find a Twenty partner" -msgstr "Trouvez un partenaire Twenty" - -#. js-lingui-id: S6CEQ9 -#: src/platform/routing/static-website-routes.ts -msgid "Find a Twenty Partner — Open Source CRM Marketplace" -msgstr "" - -#. js-lingui-id: wHyJkT -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -msgid "Find the right partner to implement, customize, and tailor Twenty to your team." -msgstr "" - -#. js-lingui-id: 5asqas -#: src/partners-marketplace/marketplace-header.tsx -msgid "Find your *Twenty partner*" -msgstr "" - -#. js-lingui-id: 9V48qi -#: src/partner-application/data/partner-country-options.ts -msgid "Finland 🇫🇮" -msgstr "" - -#. js-lingui-id: USZ2N6 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Finnish" -msgstr "" - -#. js-lingui-id: PHM5wp -#: src/case-studies/case-study-stories.ts -msgid "Flexibility" -msgstr "" - -#. js-lingui-id: YsFkku -#: src/platform/releases/release-notes.tsx -msgid "Flexible relations" -msgstr "" - -#. js-lingui-id: HBJ0P5 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "" -"Flow\n" -"orchestration" -msgstr "" - -#. js-lingui-id: obrJBN -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Fly through your workspace with shortcuts and short load times." -msgstr "" - -#. js-lingui-id: HjFq2b -#: src/case-studies/case-study-stories.ts -msgid "Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute." -msgstr "" - -#. js-lingui-id: mjIRMF -#: src/case-studies/case-study-stories.ts -msgid "Focus on the use case, not the *plumbing*" -msgstr "" - -#. js-lingui-id: P5E+kT -#: src/case-studies/case-study-stories.ts -msgid "Focus on the use case, not the plumbing" -msgstr "" - -#. js-lingui-id: wdVyxi -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Folder/Label import" -msgstr "" - -#. js-lingui-id: qwJuVW -#: src/sections/footer/footer-nav.tsx -msgid "Footer" -msgstr "" - -#. js-lingui-id: CKQ0za -#: src/case-studies/case-study-stories.ts -msgid "For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation." -msgstr "" - -#. js-lingui-id: yAJC9c -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it." -msgstr "" - -#. js-lingui-id: UCoxP5 -#: src/sections/testimonials/partner-testimonials.data.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -#: src/case-studies/case-study-catalog.ts -msgid "Founder, Nine Dots Ventures" -msgstr "" - -#. js-lingui-id: IPaRlc -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Founder, Wintactix" -msgstr "" - -#. js-lingui-id: 671GY5 -#: src/partner-application/data/partner-country-options.ts -msgid "France 🇫🇷" -msgstr "" - -#. js-lingui-id: tUgSXd -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Free for you!" -msgstr "" - -#. js-lingui-id: nLC6tu -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "French" -msgstr "" - -#. js-lingui-id: weRlb1 -#: src/partners-marketplace/partner-money-row.tsx -msgid "from {minBudget}" -msgstr "" - -#. js-lingui-id: Iuxc00 -#: src/sections/product-feature/feature-tiles.ts -msgid "From CSV to CRM in minutes." -msgstr "" - -#. js-lingui-id: Mxpask -#: src/case-studies/case-study-stories.ts -msgid "From documents to *open APIs*" -msgstr "" - -#. js-lingui-id: emeKZ7 -#: src/case-studies/case-study-stories.ts -msgid "From documents to open APIs" -msgstr "" - -#. js-lingui-id: 2CtZ6T -#: src/case-studies/case-study-stories.ts -msgid "" -"From Salesforce to\n" -"*self-hosted Twenty*" -msgstr "" - -#. js-lingui-id: kl+hEJ -#: src/case-studies/case-study-catalog.ts -msgid "From Salesforce to self-hosted Twenty" -msgstr "" - -#. js-lingui-id: syU/BD -#: src/case-studies/case-study-stories.ts -msgid "From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners" -msgstr "" - -#. js-lingui-id: UfoVki -#: src/case-studies/case-study-stories.ts -msgid "From simple to *advanced*" -msgstr "" - -#. js-lingui-id: Lf7cb3 -#: src/case-studies/case-study-stories.ts -msgid "From simple to advanced" -msgstr "" - -#. js-lingui-id: m1I5TY -#: src/sections/product-feature/feature-tiles.ts -msgid "Full communication history in one place" -msgstr "" - -#. js-lingui-id: wXgKOm -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Full customization" -msgstr "" - -#. js-lingui-id: YZ7Q3Z -#: src/case-studies/case-study-catalog.ts -msgid "Full ownership" -msgstr "" - -#. js-lingui-id: hdxwWi -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Fully customizable" -msgstr "" - -#. js-lingui-id: //hrfs -#: src/partner-application/data/partner-country-options.ts -msgid "Gabon 🇬🇦" -msgstr "" - -#. js-lingui-id: yau9J6 -#: src/partner-application/data/partner-country-options.ts -msgid "Gambia 🇬🇲" -msgstr "" - -#. js-lingui-id: S84RWl -#: src/sections/product-hero/ai-hero-tabs.ts -msgid "Generate tasks for my top 10 accounts" -msgstr "" - -#. js-lingui-id: GOmD9p -#: src/partner-application/data/partner-country-options.ts -msgid "Georgia 🇬🇪" -msgstr "" - -#. js-lingui-id: DDcvSo -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "German" -msgstr "" - -#. js-lingui-id: XcPIuI -#: src/partner-application/data/partner-country-options.ts -msgid "Germany 🇩🇪" -msgstr "" - -#. js-lingui-id: ZDIydz -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -#: src/sections/product-hero/product-hero.tsx -#: src/sections/menu/menu.tsx -#: src/sections/menu/menu.tsx -#: src/sections/home-hero/home-hero.tsx -#: src/sections/footer/footer.data.ts -#: src/sections/faq/faq.tsx -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "Get started" -msgstr "Commencer" - -#. js-lingui-id: xyKSqi -#: src/partner-application/data/partner-country-options.ts -msgid "Ghana 🇬🇭" -msgstr "" - -#. js-lingui-id: 3QRTgQ -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "GitHub (opens in new tab)" -msgstr "GitHub (ouvre un nouvel onglet)" - -#. js-lingui-id: wuH0g5 -#: src/platform/releases/release-notes.tsx -msgid "Gmail integration" -msgstr "" - -#. js-lingui-id: n8waaJ -#: src/sections/stepper/product-stepper-content.tsx -msgid "Go the extra mile *with no-code*" -msgstr "" - -#. js-lingui-id: Ay/vbT -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Good choice!" -msgstr "" - -#. js-lingui-id: opD7oA -#: src/platform/releases/release-notes.tsx -msgid "Google Calendar Integration" -msgstr "" - -#. js-lingui-id: Zh0acB -#: src/partner-application/partner-application-copy.ts -msgid "Grab 30 minutes so we can get to know your team." -msgstr "" - -#. js-lingui-id: 1W3PAd -#: src/platform/releases/release-notes.tsx -msgid "Granular Email Folder Sync" -msgstr "" - -#. js-lingui-id: +tDN2S -#: src/partner-application/data/partner-country-options.ts -msgid "Greece 🇬🇷" -msgstr "" - -#. js-lingui-id: CZXzs4 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Greek" -msgstr "" - -#. js-lingui-id: DDgHcm -#: src/partner-application/data/partner-country-options.ts -msgid "Grenada 🇬🇩" -msgstr "" - -#. js-lingui-id: MCLWq4 -#: src/sections/helped/helped.data.ts -msgid "Grow with a flexible foundation" -msgstr "Grandissez sur une fondation flexible" - -#. js-lingui-id: M/8CC1 -#: src/partner-application/data/partner-country-options.ts -msgid "Guatemala 🇬🇹" -msgstr "" - -#. js-lingui-id: UZbq7J -#: src/partner-application/data/partner-country-options.ts -msgid "Guinea 🇬🇳" -msgstr "" - -#. js-lingui-id: vtpxPx -#: src/partner-application/data/partner-country-options.ts -msgid "Guinea-Bissau 🇬🇼" -msgstr "" - -#. js-lingui-id: GT8Ua2 -#: src/partner-application/data/partner-country-options.ts -msgid "Guyana 🇬🇾" -msgstr "" - -#. js-lingui-id: 5BLiJj -#: src/partner-application/data/partner-country-options.ts -msgid "Haiti 🇭🇹" -msgstr "" - -#. js-lingui-id: Xf5EJg -#: src/sections/footer/footer.data.ts -msgid "Halftone generator" -msgstr "Générateur de demi-teintes" - -#. js-lingui-id: DHC85F -#: src/platform/routing/static-website-routes.ts -msgid "Halftone Generator | Twenty" -msgstr "" - -#. js-lingui-id: c3XJ18 -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -#: src/sections/footer/footer.data.ts -msgid "Help" -msgstr "Aide" - -#. js-lingui-id: CRzGla -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Help center" -msgstr "" - -#. js-lingui-id: LiWOgh -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Hey, I'm interested in meeting. Here's my project:" -msgstr "" - -#. js-lingui-id: EhWatX -#: src/app-preview/terminal/diff/diff-pill.tsx -msgid "Hide changes" -msgstr "" - -#. js-lingui-id: tGjibo -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Hindi" -msgstr "" - -#. js-lingui-id: qfSbUb -#: src/case-studies/case-study-stories.ts -msgid "His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix." -msgstr "" - -#. js-lingui-id: i0qMbr -#: src/sections/menu/menu.tsx -#: src/sections/footer/footer.data.ts -msgid "Home" -msgstr "Accueil" - -#. js-lingui-id: CtU7yU -#: src/case-studies/case-study-stories.ts -msgid "Homeseller" -msgstr "" - -#. js-lingui-id: KYnPnU -#: src/case-studies/case-study-stories.ts -msgid "Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together." -msgstr "" - -#. js-lingui-id: v6cmMq -#: src/case-studies/case-study-stories.ts -msgid "Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time." -msgstr "" - -#. js-lingui-id: xaIV9m -#: src/case-studies/case-study-stories.ts -msgid "Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty" -msgstr "" - -#. js-lingui-id: zbfmqm -#: src/partner-application/data/partner-country-options.ts -msgid "Honduras 🇭🇳" -msgstr "" - -#. js-lingui-id: mqX9AX -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Hosting & Infrastructure" -msgstr "" - -#. js-lingui-id: SHZNBm -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Hourly" -msgstr "" - -#. js-lingui-id: Ivq5+7 -#: src/partner-application/partner-application-copy.ts -msgid "Hourly rate" -msgstr "" - -#. js-lingui-id: XnFo3G -#: src/case-studies/case-study-stories.ts -msgid "How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership." -msgstr "" - -#. js-lingui-id: PYi0f6 -#: src/case-studies/case-study-stories.ts -msgid "How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership." -msgstr "" - -#. js-lingui-id: +MLOVo -#: src/case-studies/case-study-stories.ts -msgid "How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack." -msgstr "" - -#. js-lingui-id: OIwpKt -#: src/sections/faq/faq.data.ts -msgid "How long does it take to get started?" -msgstr "Combien de temps faut-il pour démarrer ?" - -#. js-lingui-id: iRzy9e -#: src/case-studies/case-study-stories.ts -msgid "How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows." -msgstr "" - -#. js-lingui-id: NZYA4S -#: src/case-studies/case-study-stories.ts -msgid "How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day." -msgstr "" - -#. js-lingui-id: 5sWcC0 -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "" -"How teams\n" -"*built with Twenty*" -msgstr "" - -#. js-lingui-id: Z3Cabh -#: src/platform/routing/static-website-routes.ts -msgid "How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy." -msgstr "" - -#. js-lingui-id: URQPvK -#: src/case-studies/case-study-stories.ts -msgid "How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone." -msgstr "" - -#. js-lingui-id: htrFcw -#: src/partner-application/data/partner-country-options.ts -msgid "Hungary 🇭🇺" -msgstr "" - -#. js-lingui-id: T6wyby -#: src/partner-application/partner-application-copy.ts -msgid "I'll book later →" -msgstr "" - -#. js-lingui-id: RYDa0v -#: src/partner-application/data/partner-country-options.ts -msgid "Iceland 🇮🇸" -msgstr "" - -#. js-lingui-id: ePYQjq -#: src/partner-application/partner-application-copy.ts -msgid "Identity" -msgstr "" - -#. js-lingui-id: Grur3I -#: src/platform/releases/release-notes.tsx -msgid "IMAP" -msgstr "" - -#. js-lingui-id: l0JGUk -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Impersonate users" -msgstr "" - -#. js-lingui-id: N4OVNn -#: src/case-studies/case-study-stories.ts -msgid "Implementation" -msgstr "" - -#. js-lingui-id: yHueLx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Implementation partners" -msgstr "" - -#. js-lingui-id: 9P1c4k -#: src/platform/releases/release-notes.tsx -msgid "Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched." -msgstr "" - -#. js-lingui-id: WxaeWx -#: src/platform/releases/release-notes.tsx -msgid "Import Relations" -msgstr "" - -#. js-lingui-id: BHNxPe -#: src/platform/releases/release-notes.tsx -msgid "Import V2" -msgstr "" - -#. js-lingui-id: ZAKTS6 -#: src/sections/product-feature/feature-tiles.ts -msgid "Import your data with field mapping, including relations. Export anytime — your data is always yours." -msgstr "" - -#. js-lingui-id: cCwGqi -#: src/platform/releases/release-notes.tsx -msgid "Improved Onboarding Experience" -msgstr "" - -#. js-lingui-id: 86Q2Qb -#: src/platform/releases/release-notes.tsx -msgid "Improved Performance" -msgstr "" - -#. js-lingui-id: InyU0Z -#: src/case-studies/case-study-stories.ts -msgid "In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect." -msgstr "" - -#. js-lingui-id: d1Aru8 -#: src/sections/helped/helped-scene.tsx -msgid "In production." -msgstr "En production." - -#. js-lingui-id: Sqb+jp -#: src/sections/product-feature/feature-tiles.ts -msgid "In-app preview for supported file types (when enabled)" -msgstr "" - -#. js-lingui-id: 3XP8Lk -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Included!" -msgstr "" - -#. js-lingui-id: /c4yUr -#: src/partner-application/data/partner-country-options.ts -msgid "India 🇮🇳" -msgstr "" - -#. js-lingui-id: iEJqDi -#: src/partner-application/data/partner-country-options.ts -msgid "Indonesia 🇮🇩" -msgstr "" - -#. js-lingui-id: BQukYF -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Indonesian" -msgstr "" - -#. js-lingui-id: S8gy7K -#: src/sections/case-study-detail/case-study-highlights.tsx -msgid "Industry" -msgstr "" - -#. js-lingui-id: MeL8SS -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Infinite scroll" -msgstr "" - -#. js-lingui-id: +mOisw -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Infinite scroll is still coming soon, unlike the invoice." -msgstr "" - -#. js-lingui-id: K8iwJx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Install shared tarball app" -msgstr "" - -#. js-lingui-id: AHWM9N -#: src/case-studies/case-study-stories.ts -msgid "Integration" -msgstr "" - -#. js-lingui-id: OChKCc -#: src/platform/routing/static-website-routes.ts -msgid "Interactive halftone generator exported from Twenty." -msgstr "" - -#. js-lingui-id: +83cJG -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Interested in meeting {partnerName}" -msgstr "" - -#. js-lingui-id: MAqMna -#: src/platform/releases/release-notes.tsx -msgid "Internal Email Privacy" -msgstr "" - -#. js-lingui-id: 0ysJ3C -#: src/platform/releases/release-notes.tsx -msgid "Internal team emails won't sync, protecting privacy by preventing access to internal discussions." -msgstr "" - -#. js-lingui-id: a+PGuG -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Internet accounts per user" -msgstr "" - -#. js-lingui-id: 87rKhU -#: src/platform/releases/release-notes.tsx -msgid "Introduced a \"Data Model Diagram\" feature that allows users to visualize the relationships between different objects within the CRM." -msgstr "" - -#. js-lingui-id: vJncsm -#: src/platform/releases/release-notes.tsx -msgid "Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis." -msgstr "" - -#. js-lingui-id: TR1ici -#: src/platform/releases/release-notes.tsx -msgid "Introduced a new design for notifications featuring lighter colors." -msgstr "" - -#. js-lingui-id: 5G37wD -#: src/platform/releases/release-notes.tsx -msgid "Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today." -msgstr "" - -#. js-lingui-id: 5BnBV4 -#: src/platform/releases/release-notes.tsx -msgid "Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!" -msgstr "" - -#. js-lingui-id: KBwqIW -#: src/platform/releases/release-notes.tsx -msgid "Invite roles" -msgstr "" - -#. js-lingui-id: FtgjCv -#: src/partner-application/data/partner-country-options.ts -msgid "Iran 🇮🇷" -msgstr "" - -#. js-lingui-id: 8yynyz -#: src/partner-application/data/partner-country-options.ts -msgid "Iraq 🇮🇶" -msgstr "" - -#. js-lingui-id: s7XmoY -#: src/partner-application/data/partner-country-options.ts -msgid "Ireland 🇮🇪" -msgstr "" - -#. js-lingui-id: /yQIKP -#: src/sections/faq/faq.data.ts -msgid "Is Twenty really open-source?" -msgstr "Twenty est-il vraiment open source ?" - -#. js-lingui-id: SdtpDP -#: src/partner-application/data/partner-country-options.ts -msgid "Israel 🇮🇱" -msgstr "" - -#. js-lingui-id: QjEULz -#: src/case-studies/case-study-catalog.ts -msgid "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other." -msgstr "" - -#. js-lingui-id: FJ51pP -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -msgid "It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not." -msgstr "C'est tout simplement une bien meilleure expérience qu'un Salesforce ou un HubSpot. Ma mission a été de rendre chaque outil accessible par API, pour que tout communique. Twenty l'a rendu possible d'une manière que les plateformes CRM plus anciennes ne permettent tout simplement pas." - -#. js-lingui-id: kqIAbN -#: src/case-studies/case-study-stories.ts -msgid "It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck." -msgstr "" - -#. js-lingui-id: ltNDOB -#: src/sections/problem/problem.data.ts -msgid "It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden." -msgstr "C'est fragile. La V1 sort vite, mais la maintenance et les évolutions deviennent un fardeau sur la durée." - -#. js-lingui-id: Lj7sBL -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Italian" -msgstr "" - -#. js-lingui-id: OSTD8d -#: src/partner-application/data/partner-country-options.ts -msgid "Italy 🇮🇹" -msgstr "" - -#. js-lingui-id: 0BTIQi -#: src/partner-application/data/partner-country-options.ts -msgid "Ivory Coast 🇨🇮" -msgstr "" - -#. js-lingui-id: W6o2Pv -#: src/partner-application/data/partner-country-options.ts -msgid "Jamaica 🇯🇲" -msgstr "" - -#. js-lingui-id: kpk6mj -#: src/partner-application/data/partner-country-options.ts -msgid "Japan 🇯🇵" -msgstr "" - -#. js-lingui-id: dFtidv -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Japanese" -msgstr "" - -#. js-lingui-id: Lsf2+K -#: src/partner-application/partner-application-copy.ts -msgid "Join our ecosystem and help businesses take control of their customer data with open-source primitives." -msgstr "" - -#. js-lingui-id: 1qiriB -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Join our growing partner ecosystem" -msgstr "" - -#. js-lingui-id: VQIurp -#: src/sections/partner-signoff/partner-signoff.tsx -msgid "Join our partner ecosystem and help businesses take control of their CRM." -msgstr "" - -#. js-lingui-id: m/pXki -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "Join the teams that chose to own their CRM. Start building with Twenty today." -msgstr "" - -#. js-lingui-id: QbxNys -#: src/partner-application/data/partner-country-options.ts -msgid "Jordan 🇯🇴" -msgstr "" - -#. js-lingui-id: VnZMnC -#: src/platform/releases/release-notes.tsx -msgid "JSON Field" -msgstr "" - -#. js-lingui-id: pB76mP -#: src/case-studies/case-study-catalog.ts -msgid "Jul 2025" -msgstr "" - -#. js-lingui-id: hvwlu3 -#: src/case-studies/case-study-catalog.ts -msgid "Jun 2025" -msgstr "" - -#. js-lingui-id: qrYDGE -#: src/sections/testimonials/testimonials.data.ts -msgid "Justin Beadle" -msgstr "Justin Beadle" - -#. js-lingui-id: vYXuJI -#: src/case-studies/case-study-stories.ts -msgid "Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions." -msgstr "" - -#. js-lingui-id: E6Oohx -#: src/case-studies/case-study-stories.ts -msgid "Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it." -msgstr "" - -#. js-lingui-id: 3LDjR0 -#: src/platform/releases/release-notes.tsx -msgid "Kanbans on any object" -msgstr "" - -#. js-lingui-id: r1cFAW -#: src/partner-application/data/partner-country-options.ts -msgid "Kazakhstan 🇰🇿" -msgstr "" - -#. js-lingui-id: kEahsE -#: src/partner-application/data/partner-country-options.ts -msgid "Kenya 🇰🇪" -msgstr "" - -#. js-lingui-id: TLanjj -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "kept" -msgstr "" - -#. js-lingui-id: IxBSi8 -#: src/partner-application/data/partner-country-options.ts -msgid "Kiribati 🇰🇮" -msgstr "" - -#. js-lingui-id: h6S9Yz -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Korean" -msgstr "" - -#. js-lingui-id: PqhUrP -#: src/partner-application/data/partner-country-options.ts -msgid "Kosovo 🇽🇰" -msgstr "" - -#. js-lingui-id: 3+TwF3 -#: src/partner-application/data/partner-country-options.ts -msgid "Kuwait 🇰🇼" -msgstr "" - -#. js-lingui-id: e9zZkH -#: src/partner-application/data/partner-country-options.ts -msgid "Kyrgyzstan 🇰🇬" -msgstr "" - -#. js-lingui-id: 8QgJZb -#: src/platform/releases/release-notes.tsx -msgid "Labs" -msgstr "" - -#. js-lingui-id: GAmD3h -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/partners-marketplace/partner-facts-list.tsx -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Languages" -msgstr "" - -#. js-lingui-id: u6jooT -#: src/partner-application/partner-application-copy.ts -msgid "Languages spoken" -msgstr "" - -#. js-lingui-id: YHacTY -#: src/partner-application/data/partner-country-options.ts -msgid "Laos 🇱🇦" -msgstr "" - -#. js-lingui-id: 2lrGbG -#: src/partners-marketplace/served-geo-labels.ts -msgid "LATAM" -msgstr "" - -#. js-lingui-id: WvrtRi -#: src/sections/releases-hero/releases-hero.tsx -msgid "" -"Latest\n" -"*Releases*" -msgstr "" - -#. js-lingui-id: 7OHfcc -#: src/partner-application/data/partner-country-options.ts -msgid "Latvia 🇱🇻" -msgstr "" - -#. js-lingui-id: rdU729 -#: src/sections/stepper/product-stepper-data.ts -msgid "Layout" -msgstr "" - -#. js-lingui-id: +Ss/og -#: src/sections/menu/menu.data.ts -msgid "Learn how to use Twenty" -msgstr "Apprenez à utiliser Twenty" - -#. js-lingui-id: wB0DGn -#: src/partner-application/data/partner-country-options.ts -msgid "Lebanon 🇱🇧" -msgstr "" - -#. js-lingui-id: vifyyw -#: src/sections/footer/footer.data.ts -msgid "Legal" -msgstr "Mentions légales" - -#. js-lingui-id: UqdHpG -#: src/partner-application/data/partner-country-options.ts -msgid "Lesotho 🇱🇸" -msgstr "" - -#. js-lingui-id: rJargy -#: src/partner-application/data/partner-country-options.ts -msgid "Liberia 🇱🇷" -msgstr "" - -#. js-lingui-id: Lzw0kM -#: src/partner-application/data/partner-country-options.ts -msgid "Libya 🇱🇾" -msgstr "" - -#. js-lingui-id: tHFTlp -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Licensee:" -msgstr "" - -#. js-lingui-id: K41WYc -#: src/partner-application/data/partner-country-options.ts -msgid "Liechtenstein 🇱🇮" -msgstr "" - -#. js-lingui-id: ESTOTK -#: src/platform/releases/release-notes.tsx -msgid "Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content." -msgstr "" - -#. js-lingui-id: kvxPie -#: src/platform/releases/release-notes.tsx -msgid "Link field" -msgstr "" - -#. js-lingui-id: gggTBm -#: src/sections/footer/footer.data.ts -msgid "LinkedIn" -msgstr "LinkedIn" - -#. js-lingui-id: 3hSKC5 -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "LinkedIn (opens in new tab)" -msgstr "LinkedIn (ouvre un nouvel onglet)" - -#. js-lingui-id: Gg69LR -#: src/partner-application/partner-application-copy.ts -msgid "LinkedIn URL" -msgstr "" - -#. js-lingui-id: 2WIZYd -#: src/partner-application/data/partner-country-options.ts -msgid "Lithuania 🇱🇹" -msgstr "" - -#. js-lingui-id: AHVzME -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Live data and AI built" -msgstr "Données en direct et IA intégrée" - -#. js-lingui-id: GObQuL -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Live updates" -msgstr "" - -#. js-lingui-id: zmRZwk -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Live updates are unavailable, which is almost more honest." -msgstr "" - -#. js-lingui-id: ObPscj -#: src/sections/enterprise-activate/enterprise-activate-panel.tsx -msgid "Loading activation…" -msgstr "" - -#. js-lingui-id: Oyf4mg -#: src/contact-cal/contact-cal-modal.tsx -msgid "Loading form…" -msgstr "" - -#. js-lingui-id: Pwqkdw -#: src/partner-application/partner-application-modal.tsx -msgid "Loading…" -msgstr "" - -#. js-lingui-id: 7VBQ2j -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Local, Production" -msgstr "" - -#. js-lingui-id: JO8Bdx -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Lock-in" -msgstr "" - -#. js-lingui-id: sQia9P -#: src/sections/menu/menu.tsx -#: src/sections/menu/menu-drawer.tsx -msgid "Log in" -msgstr "Connexion" - -#. js-lingui-id: KPLAuI -#: src/case-studies/case-study-catalog.ts -msgid "Lower CRM cost" -msgstr "" - -#. js-lingui-id: J13skq -#: src/partner-application/data/partner-country-options.ts -msgid "Luxembourg 🇱🇺" -msgstr "" - -#. js-lingui-id: nRYQC8 -#: src/partner-application/data/partner-country-options.ts -msgid "Madagascar 🇲🇬" -msgstr "" - -#. js-lingui-id: /hmUGb -#: src/platform/releases/release-notes.tsx -msgid "Maintenance mode" -msgstr "" - -#. js-lingui-id: BNd15Z -#: src/sections/feature-cards/feature-cards.tsx -msgid "Make your GTM team happy with *a CRM they'll love*" -msgstr "Rendez votre équipe GTM heureuse avec *un CRM qu'elle va adorer*" - -#. js-lingui-id: qHvKxh -#: src/partner-application/data/partner-country-options.ts -msgid "Malawi 🇲🇼" -msgstr "" - -#. js-lingui-id: tF97tn -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Malay" -msgstr "" - -#. js-lingui-id: DIOh5g -#: src/partner-application/data/partner-country-options.ts -msgid "Malaysia 🇲🇾" -msgstr "" - -#. js-lingui-id: 62/ScF -#: src/partner-application/data/partner-country-options.ts -msgid "Maldives 🇲🇻" -msgstr "" - -#. js-lingui-id: wc5E/3 -#: src/partner-application/data/partner-country-options.ts -msgid "Mali 🇲🇱" -msgstr "" - -#. js-lingui-id: 04fjhR -#: src/partner-application/data/partner-country-options.ts -msgid "Malta 🇲🇹" -msgstr "" - -#. js-lingui-id: Si4WyF -#: src/case-studies/case-study-catalog.ts -msgid "Management Consulting" -msgstr "" - -#. js-lingui-id: TMZPkv -#: src/platform/releases/release-notes.tsx -msgid "Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run." -msgstr "" - -#. js-lingui-id: poX06f -#: src/case-studies/case-study-catalog.ts -msgid "Manual work at core" -msgstr "" - -#. js-lingui-id: VJOKPB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Maps view" -msgstr "" - -#. js-lingui-id: Zt5PUS -#: src/partners-marketplace/marketplace-header.tsx -msgid "Marketplace" -msgstr "" - -#. js-lingui-id: 2jVbnO -#: src/partner-application/data/partner-country-options.ts -msgid "Marshall Islands 🇲🇭" -msgstr "" - -#. js-lingui-id: bJNKJ1 -#: src/sections/menu/menu.data.ts -msgid "Master every corner of Twenty" -msgstr "Maîtrisez Twenty dans ses moindres recoins" - -#. js-lingui-id: HG/EUg -#: src/partner-application/data/partner-country-options.ts -msgid "Mauritania 🇲🇷" -msgstr "" - -#. js-lingui-id: YDiaY/ -#: src/partner-application/data/partner-country-options.ts -msgid "Mauritius 🇲🇺" -msgstr "" - -#. js-lingui-id: Zw+Zv+ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "MCP server" -msgstr "" - -#. js-lingui-id: bwCiCi -#: src/sections/menu/menu.data.ts -msgid "Meet the certified agencies and consultants implementing Twenty for teams worldwide." -msgstr "Rencontrez les agences et consultants certifiés qui déploient Twenty pour des équipes du monde entier." - -#. js-lingui-id: ujYZ+f -#: src/sections/case-study-promo/case-study-promo.tsx -msgid "Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks." -msgstr "" - -#. js-lingui-id: CQ9M36 -#: src/partners-marketplace/served-geo-labels.ts -msgid "MENA" -msgstr "" - -#. js-lingui-id: +9RIKB -#: src/platform/releases/release-notes.tsx -msgid "Merge Records" -msgstr "" - -#. js-lingui-id: briyJf -#: src/sections/product-feature/feature-tiles.ts -msgid "Metrics you can actually trust." -msgstr "" - -#. js-lingui-id: YBLFQZ -#: src/partner-application/data/partner-country-options.ts -msgid "Mexico 🇲🇽" -msgstr "" - -#. js-lingui-id: KBirDR -#: src/partner-application/data/partner-country-options.ts -msgid "Micronesia 🇫🇲" -msgstr "" - -#. js-lingui-id: YeVpda -#: src/platform/releases/release-notes.tsx -msgid "Microsoft o365 Integration" -msgstr "" - -#. js-lingui-id: so04x6 -#: src/case-studies/case-study-stories.ts -msgid "Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it." -msgstr "" - -#. js-lingui-id: izddzp -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Mike Babiy" -msgstr "" - -#. js-lingui-id: 3TSz9S -#: src/app-preview/stage/traffic-lights.tsx -msgid "Minimize" -msgstr "" - -#. js-lingui-id: FFFENV -#: src/partner-application/partner-application-copy.ts -msgid "Minimum project budget" -msgstr "" - -#. js-lingui-id: 179i38 -#: src/platform/releases/release-notes.tsx -msgid "Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place." -msgstr "" - -#. js-lingui-id: 6m8rMT -#: src/partner-application/data/partner-country-options.ts -msgid "Moldova 🇲🇩" -msgstr "" - -#. js-lingui-id: qRRmSe -#: src/partner-application/data/partner-country-options.ts -msgid "Monaco 🇲🇨" -msgstr "" - -#. js-lingui-id: G+EV+A -#: src/partner-application/data/partner-country-options.ts -msgid "Mongolia 🇲🇳" -msgstr "" - -#. js-lingui-id: 9VDoNp -#: src/partner-application/data/partner-country-options.ts -msgid "Montenegro 🇲🇪" -msgstr "" - -#. js-lingui-id: +8Nek/ -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Monthly" -msgstr "" - -#. js-lingui-id: paxFAm -#: src/platform/releases/release-notes.tsx -msgid "More field relations" -msgstr "" - -#. js-lingui-id: kHdAOE -#: src/platform/releases/release-notes.tsx -msgid "More Field Types, More Power" -msgstr "" - -#. js-lingui-id: VqXuUv -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "More options available!" -msgstr "" - -#. js-lingui-id: AZrhlt -#: src/platform/releases/release-notes.tsx -msgid "More powerful search" -msgstr "" - -#. js-lingui-id: LAFO4Y -#: src/partner-application/data/partner-country-options.ts -msgid "Morocco 🇲🇦" -msgstr "" - -#. js-lingui-id: E4h9+U -#: src/platform/releases/release-notes.tsx -msgid "Morph Many Relationships" -msgstr "" - -#. js-lingui-id: EwJDrS -#: src/partner-application/data/partner-country-options.ts -msgid "Mozambique 🇲🇿" -msgstr "" - -#. js-lingui-id: dlKkNL -#: src/sections/product-feature/feature-tiles.ts -msgid "Multi-file upload on records" -msgstr "" - -#. js-lingui-id: 4nwdYp -#: src/platform/releases/release-notes.tsx -msgid "Multi-Record Workflow Triggers" -msgstr "" - -#. js-lingui-id: S5w2Q/ -#: src/platform/releases/release-notes.tsx -msgid "Multi-Select Field" -msgstr "" - -#. js-lingui-id: Gorywi -#: src/platform/releases/release-notes.tsx -msgid "Multi-Workspace" -msgstr "" - -#. js-lingui-id: QGWbbv -#: src/partner-application/data/partner-country-options.ts -msgid "Myanmar 🇲🇲" -msgstr "" - -#. js-lingui-id: 6YtxFj -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Name" -msgstr "" - -#. js-lingui-id: yYmxee -#: src/partner-application/data/partner-country-options.ts -msgid "Namibia 🇳🇦" -msgstr "" - -#. js-lingui-id: zVOV14 -#: src/partner-application/data/partner-country-options.ts -msgid "Nauru 🇳🇷" -msgstr "" - -#. js-lingui-id: Akl9+2 -#: src/platform/releases/release-notes.tsx -msgid "Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \"Close\" button." -msgstr "" - -#. js-lingui-id: TizFpt -#: src/sections/menu/menu-drawer.tsx -msgid "Navigation menu" -msgstr "Menu de navigation" - -#. js-lingui-id: LfNsfa -#: src/sections/stepper/product-stepper-content.tsx -msgid "Need a quick change? Skip the engineering ticket. Customize your workspace in minutes." -msgstr "" - -#. js-lingui-id: 4sbgPq -#: src/sections/pricing-engagement-band/pricing-engagement-band.tsx -msgid "Need help with customization?" -msgstr "" - -#. js-lingui-id: LNVNNE -#: src/partner-application/data/partner-country-options.ts -msgid "Nepal 🇳🇵" -msgstr "" - -#. js-lingui-id: g60EgR -#: src/partner-application/data/partner-country-options.ts -msgid "Netherlands 🇳🇱" -msgstr "" - -#. js-lingui-id: 8Cp4Of -#: src/case-studies/case-study-stories.ts -msgid "NetZero" -msgstr "" - -#. js-lingui-id: J8ZssL -#: src/sections/helped/helped.data.ts -msgid "NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems." -msgstr "NetZero exploite une configuration Twenty modulaire couvrant crédits carbone, produits agricoles et systèmes industriels." - -#. js-lingui-id: 7HVBV+ -#: src/case-studies/case-study-catalog.ts -msgid "NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows." -msgstr "" - -#. js-lingui-id: 3PtYTO -#: src/case-studies/case-study-stories.ts -msgid "NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation." -msgstr "" - -#. js-lingui-id: zgjuZq -#: src/platform/releases/release-notes.tsx -msgid "New Array field type" -msgstr "" - -#. js-lingui-id: cU1+gU -#: src/platform/releases/release-notes.tsx -msgid "New record page" -msgstr "" - -#. js-lingui-id: pAKqTG -#: src/platform/releases/release-notes.tsx -msgid "New Settings layout" -msgstr "" - -#. js-lingui-id: a54odP -#: src/platform/releases/release-notes.tsx -msgid "New Side Panel" -msgstr "" - -#. js-lingui-id: /DTtCF -#: src/partner-application/data/partner-country-options.ts -msgid "New Zealand 🇳🇿" -msgstr "" - -#. js-lingui-id: GY6uSc -#: src/partner-application/partner-application-copy.ts -msgid "Next →" -msgstr "" - -#. js-lingui-id: KqojOL -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Next steps" -msgstr "" - -#. js-lingui-id: awYrJD -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Next testimonial" -msgstr "Témoignage suivant" - -#. js-lingui-id: iBOZv7 -#: src/partner-application/data/partner-country-options.ts -msgid "Nicaragua 🇳🇮" -msgstr "" - -#. js-lingui-id: 61NU7V -#: src/partner-application/data/partner-country-options.ts -msgid "Niger 🇳🇪" -msgstr "" - -#. js-lingui-id: +2NLII -#: src/partner-application/data/partner-country-options.ts -msgid "Nigeria 🇳🇬" -msgstr "" - -#. js-lingui-id: qZ+egR -#: src/case-studies/case-study-catalog.ts -msgid "Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations." -msgstr "" - -#. js-lingui-id: sGuHDu -#: src/case-studies/case-study-stories.ts -msgid "Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day." -msgstr "" - -#. js-lingui-id: G0GGKA -#: src/case-studies/case-study-stories.ts -msgid "Nine Dots Ventures" -msgstr "" - -#. js-lingui-id: 1UzENP -#: src/sections/pricing-plan-table/plan-table-content.tsx -msgid "No" -msgstr "" - -#. js-lingui-id: 6tRXQ4 -#: src/partner-application/partner-application-copy.ts -msgid "No matching country." -msgstr "" - -#. js-lingui-id: 1hNHaC -#: src/case-studies/case-study-stories.ts -msgid "No more renting someone else's *structure*" -msgstr "" - -#. js-lingui-id: LmWdm6 -#: src/case-studies/case-study-stories.ts -msgid "No more renting someone else's structure" -msgstr "" - -#. js-lingui-id: UxK4so -#: src/partners-marketplace/empty-state.tsx -msgid "No partners match your filters" -msgstr "" - -#. js-lingui-id: nDjC8E -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "No session ID provided. Please complete the checkout first." -msgstr "" - -#. js-lingui-id: q9f4Tp -#: src/case-studies/case-study-catalog.ts -msgid "No-code" -msgstr "" - -#. js-lingui-id: SiZ/7E -#: src/sections/faq/faq.data.ts -msgid "No. Build custom objects, fields, views, and no-code workflows straight from Settings. Unlimited, no extra charge." -msgstr "Non. Créez objets, champs, vues et workflows no-code directement depuis les Réglages. Sans limite, sans surcoût." - -#. js-lingui-id: 096JXI -#: src/partner-application/data/partner-country-options.ts -msgid "North Korea 🇰🇵" -msgstr "" - -#. js-lingui-id: IwF7aJ -#: src/partner-application/data/partner-country-options.ts -msgid "North Macedonia 🇲🇰" -msgstr "" - -#. js-lingui-id: sZwk4U -#: src/partner-application/data/partner-country-options.ts -msgid "Norway 🇳🇴" -msgstr "" - -#. js-lingui-id: 1IipHp -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Norwegian" -msgstr "" - -#. js-lingui-id: YfzRVa -#: src/platform/releases/release-notes.tsx -msgid "Notes and Tasks standard objects" -msgstr "" - -#. js-lingui-id: iDNBZe -#: src/platform/releases/release-notes.tsx -msgid "Notifications" -msgstr "" - -#. js-lingui-id: k3T2mM -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you." -msgstr "" - -#. js-lingui-id: CzeIij -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Number of dashboards" -msgstr "" - -#. js-lingui-id: pkrZnO -#: src/case-studies/case-study-stories.ts -msgid "Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first." -msgstr "" - -#. js-lingui-id: l/1LQc -#: src/sections/testimonials/testimonials.data.ts -msgid "Olivier Reinaud" -msgstr "Olivier Reinaud" - -#. js-lingui-id: BdShAR -#: src/partner-application/data/partner-country-options.ts -msgid "Oman 🇴🇲" -msgstr "" - -#. js-lingui-id: D2b+1q -#: src/case-studies/case-study-catalog.ts -msgid "On a single CRM" -msgstr "" - -#. js-lingui-id: w5ATz2 -#: src/platform/releases/release-notes.tsx -msgid "On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones." -msgstr "" - -#. js-lingui-id: XhXmzW -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "On this page" -msgstr "" - -#. js-lingui-id: jxC7HY -#: src/partner-application/data/partner-scope-options.ts -msgid "Onboarding · Documentation · Change management · L1/L2 support · Managed services" -msgstr "" - -#. js-lingui-id: pbmZ7R -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Onboarding Packs" -msgstr "" - -#. js-lingui-id: 37OSdM -#: src/case-studies/case-study-stories.ts -msgid "One *API* to rule them all" -msgstr "" - -#. js-lingui-id: Zt1UZb -#: src/case-studies/case-study-stories.ts -msgid "One API to rule them all" -msgstr "" - -#. js-lingui-id: pShqss -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Only $5 for SSO. Practically a charity program." -msgstr "" - -#. js-lingui-id: GSr0rF -#: src/sections/menu/menu.tsx -msgid "Open menu" -msgstr "Ouvrir le menu" - -#. js-lingui-id: pkXQA+ -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Open your Twenty self-hosted instance Settings → Enterprise." -msgstr "" - -#. js-lingui-id: 5RkmVr -#: src/sections/why-twenty-signoff/why-twenty-signoff.tsx -msgid "Open-source, AI-ready, and yours to shape." -msgstr "" - -#. js-lingui-id: ucgZ0o -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Organization" -msgstr "" - -#. js-lingui-id: nDTfhz -#: src/platform/releases/release-notes.tsx -msgid "Other improvements" -msgstr "" - -#. js-lingui-id: 3PlK59 -#: src/platform/releases/release-notes.tsx -msgid "Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden." -msgstr "" - -#. js-lingui-id: dKGg8T -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Out of stock" -msgstr "" - -#. js-lingui-id: PASC/7 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Outlived every redesign since 2004." -msgstr "" - -#. js-lingui-id: Bwsi7B -#: src/sections/helped/helped.data.ts -msgid "Own your CRM end to end" -msgstr "Maîtrisez votre CRM de bout en bout" - -#. js-lingui-id: oDAEQq -#: src/case-studies/case-study-stories.ts -msgid "Ownership" -msgstr "" - -#. js-lingui-id: NmF/Vo -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Owning your stack remains mysteriously out of stock." -msgstr "" - -#. js-lingui-id: h/oMMb -#: src/platform/routing/static-website-routes.ts -msgid "Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform." -msgstr "" - -#. js-lingui-id: +AiiMt -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Pagination builds character." -msgstr "" - -#. js-lingui-id: sW3DaS -#: src/partner-application/data/partner-country-options.ts -msgid "Pakistan 🇵🇰" -msgstr "" - -#. js-lingui-id: cvRU36 -#: src/partner-application/data/partner-country-options.ts -msgid "Palau 🇵🇼" -msgstr "" - -#. js-lingui-id: u2htNd -#: src/partner-application/data/partner-country-options.ts -msgid "Palestine 🇵🇸" -msgstr "" - -#. js-lingui-id: pWLp16 -#: src/partner-application/data/partner-country-options.ts -msgid "Panama 🇵🇦" -msgstr "" - -#. js-lingui-id: xOR4tu -#: src/partner-application/data/partner-country-options.ts -msgid "Papua New Guinea 🇵🇬" -msgstr "" - -#. js-lingui-id: kb3PhK -#: src/partner-application/data/partner-country-options.ts -msgid "Paraguay 🇵🇾" -msgstr "" - -#. js-lingui-id: cLitIC -#: src/partner-application/partner-application-modal.tsx -msgid "Partner application" -msgstr "" - -#. js-lingui-id: mYGIvm -#: src/partners-marketplace/partner-profile.tsx -msgid "Partner facts and contact" -msgstr "" - -#. js-lingui-id: 4RPECg -#: src/app/[locale]/(site)/partners/profile/[slug]/page.tsx -msgid "Partner not found — Twenty Partners" -msgstr "" - -#. js-lingui-id: dRIK0d -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Partner testimonials" -msgstr "" - -#. js-lingui-id: mPkInZ -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Partners" -msgstr "Partenaires" - -#. js-lingui-id: 9yo8NN -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Paste the key and click Activate." -msgstr "" - -#. js-lingui-id: TMErUt -#: src/platform/releases/release-notes.tsx -msgid "Percentage in number fields" -msgstr "" - -#. js-lingui-id: v1i9+n -#: src/platform/releases/release-notes.tsx -msgid "Performance Improvements" -msgstr "" - -#. js-lingui-id: JjOHl8 -#: src/platform/releases/release-notes.tsx -msgid "Permissions V1" -msgstr "" - -#. js-lingui-id: kJQ+gL -#: src/platform/releases/release-notes.tsx -msgid "Permissions V2" -msgstr "" - -#. js-lingui-id: OzAIDr -#: src/partner-application/data/partner-country-options.ts -msgid "Peru 🇵🇪" -msgstr "" - -#. js-lingui-id: LqRs8D -#: src/partner-application/data/partner-country-options.ts -msgid "Philippines 🇵🇭" -msgstr "" - -#. js-lingui-id: we6gj5 -#: src/partner-application/partner-application-copy.ts -msgid "Pick every category that applies." -msgstr "" - -#. js-lingui-id: KEEuJt -#: src/platform/releases/release-notes.tsx -msgid "Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client." -msgstr "" - -#. js-lingui-id: FFkjaT -#: src/sections/product-feature/feature-tiles.ts -msgid "Pipeline Management" -msgstr "" - -#. js-lingui-id: gzkkC3 -#: src/platform/routing/static-website-routes.ts -msgid "Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use." -msgstr "" - -#. js-lingui-id: z7gnI9 -#: src/partner-application/partner-application-copy.ts -msgid "Please complete all required fields before continuing." -msgstr "" - -#. js-lingui-id: AFr2a5 -#: src/partner-application/data/partner-country-options.ts -msgid "Poland 🇵🇱" -msgstr "" - -#. js-lingui-id: trnWaw -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Polish" -msgstr "" - -#. js-lingui-id: /LAeug -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Portrait of {authorName}" -msgstr "" - -#. js-lingui-id: 8BrmUs -#: src/partner-application/data/partner-country-options.ts -msgid "Portugal 🇵🇹" -msgstr "" - -#. js-lingui-id: MOERNx -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Portuguese" -msgstr "" - -#. js-lingui-id: z87IFG -#: src/partner-application/partner-application-copy.ts -msgid "Press Enter or comma to add a skill." -msgstr "" - -#. js-lingui-id: LZoO8F -#: src/sections/testimonials/testimonials-carousel.tsx -#: src/sections/testimonials/partner-testimonials-carousel.tsx -msgid "Previous testimonial" -msgstr "Témoignage précédent" - -#. js-lingui-id: a7u1N9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Price" -msgstr "" - -#. js-lingui-id: aHCEmh -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/partners-marketplace/partner-money-row.tsx -msgid "Pricing" -msgstr "Tarifs" - -#. js-lingui-id: T/R+Qz -#: src/sections/menu/menu-nav.tsx -#: src/sections/menu/menu-drawer.tsx -msgid "Primary" -msgstr "Navigation principale" - -#. js-lingui-id: J2IAmT -#: src/sections/three-cards/three-cards.data.ts -msgid "Principal and Founder" -msgstr "Dirigeant et fondateur" - -#. js-lingui-id: kXBQYM -#: src/sections/testimonials/partner-testimonials.data.ts -#: src/case-studies/case-study-catalog.ts -msgid "Principal and Founder, Alternative Partners" -msgstr "" - -#. js-lingui-id: k62X/2 -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Priority support" -msgstr "" - -#. js-lingui-id: LcET2C -#: src/sections/footer/footer.data.ts -#: src/app/[locale]/(site)/privacy-policy/page.tsx -msgid "Privacy Policy" -msgstr "Politique de confidentialité" - -#. js-lingui-id: DJ3uVe -#: src/platform/routing/static-website-routes.ts -msgid "Privacy Policy | Twenty" -msgstr "" - -#. js-lingui-id: 3fPjUY -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Pro" -msgstr "" - -#. js-lingui-id: K47k8R -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "Product" -msgstr "Produit" - -#. js-lingui-id: kIGKva -#: src/sections/three-cards/three-cards.data.ts -msgid "Production grade quality" -msgstr "Une qualité de niveau production" - -#. js-lingui-id: vERlcd -#: src/partner-application/partner-application-copy.ts -msgid "Profile" -msgstr "" - -#. js-lingui-id: CcK9cq -#: src/case-studies/case-study-stories.ts -msgid "Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around." -msgstr "" - -#. js-lingui-id: PaHxQd -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Project minimum" -msgstr "" - -#. js-lingui-id: 9NAqO4 -#: src/case-studies/case-study-catalog.ts -msgid "Proposal automation" -msgstr "" - -#. js-lingui-id: a24q7E -#: src/sections/problem/problem.data.ts -msgid "Proprietary languages, slow deployment cycles, and \"black box\" logic." -msgstr "" - -#. js-lingui-id: u9RZ7+ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Punjabi" -msgstr "" - -#. js-lingui-id: frfCYp -#: src/case-studies/case-study-catalog.ts -msgid "Q1 2026" -msgstr "" - -#. js-lingui-id: tFx+ES -#: src/partner-application/data/partner-country-options.ts -msgid "Qatar 🇶🇦" -msgstr "" - -#. js-lingui-id: OialmJ -#: src/platform/releases/release-notes.tsx -msgid "Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input." -msgstr "" - -#. js-lingui-id: 3XOwjg -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Rates" -msgstr "" - -#. js-lingui-id: zXRspj -#: src/platform/releases/release-notes.tsx -msgid "Rating field" -msgstr "" - -#. js-lingui-id: DnWJal -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "Reach out" -msgstr "" - -#. js-lingui-id: gSQVmr -#: src/sections/helped/helped-card.tsx -msgid "Read the case" -msgstr "Lire le cas client" - -#. js-lingui-id: EqCbT9 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Read/Edit/Delete permissions" -msgstr "" - -#. js-lingui-id: /6qiAz -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -msgid "" -"Ready to build\n" -"*your own story?*" -msgstr "" - -#. js-lingui-id: TqQ08B -#: src/sections/partner-signoff/partner-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -msgid "" -"Ready to grow\n" -"*with Twenty?*" -msgstr "" - -#. js-lingui-id: zTY2by -#: src/platform/routing/static-website-routes.ts -msgid "Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit." -msgstr "" - -#. js-lingui-id: NIwjHh -#: src/case-studies/case-study-catalog.ts -msgid "Real Estate" -msgstr "" - -#. js-lingui-id: CH+Ona -#: src/sections/customers-hero/customers-hero.tsx -msgid "Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth." -msgstr "" - -#. js-lingui-id: 5O1eTm -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Real-time changes? That will be a premium surprise." -msgstr "" - -#. js-lingui-id: 4hc7hc -#: src/sections/three-cards/product-three-cards-data.ts -#: src/sections/product-feature/feature-tiles.ts -msgid "Real-time data" -msgstr "" - -#. js-lingui-id: dKQCrj -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Real-time is a state of mind, not a feature." -msgstr "" - -#. js-lingui-id: P7gVBH -#: src/platform/releases/release-notes.tsx -msgid "Record is created or updated trigger" -msgstr "" - -#. js-lingui-id: Zhiuz9 -#: src/case-studies/case-study-catalog.ts -msgid "Record quarter" -msgstr "" - -#. js-lingui-id: PWlTvh -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Records" -msgstr "" - -#. js-lingui-id: q45OlW -#: src/partners-marketplace/partner-card.tsx -#: src/partners-marketplace/filter-bar.tsx -msgid "Regions" -msgstr "" - -#. js-lingui-id: GtQZI0 -#: src/platform/releases/release-notes.tsx -msgid "Relation Fields on Record Page" -msgstr "" - -#. js-lingui-id: plY6Rp -#: src/platform/releases/release-notes.tsx -msgid "Relations on Record Pages" -msgstr "" - -#. js-lingui-id: rwWjWg -#: src/sections/footer/footer.data.ts -msgid "Release Notes" -msgstr "Notes de version" - -#. js-lingui-id: 5icoS1 -#: src/sections/releases-feed/releases-feed.tsx -#: src/sections/menu/menu.data.ts -msgid "Releases" -msgstr "Versions" - -#. js-lingui-id: BkBq/5 -#. placeholder {0}: pill.text -#: src/partners-marketplace/active-filter-pills.tsx -msgid "Remove {0} filter" -msgstr "" - -#. js-lingui-id: OY7BZk -#: src/partner-application/partner-application-copy.ts -msgid "Remove {skill}" -msgstr "" - -#. js-lingui-id: a/aGHe -#: src/sections/product-feature/feature-tiles.ts -msgid "Rename, download, and delete attachments" -msgstr "" - -#. js-lingui-id: t9yxlZ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Reports" -msgstr "" - -#. js-lingui-id: SY/an2 -#: src/sections/product-feature/feature-tiles.ts -msgid "Reports & Dashboards" -msgstr "" - -#. js-lingui-id: TD9BOQ -#: src/app-preview/terminal/terminal-send-button.tsx -msgid "Reset conversation" -msgstr "" - -#. js-lingui-id: ZYyPd8 -#: src/platform/releases/release-notes.tsx -msgid "Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts." -msgstr "" - -#. js-lingui-id: tpLAlL -#: src/platform/releases/release-notes.tsx -msgid "Resize navbar and side panel" -msgstr "" - -#. js-lingui-id: s+MGs7 -#: src/sections/menu/menu.data.ts -msgid "Resources" -msgstr "Ressources" - -#. js-lingui-id: oC2l7f -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "REST & GraphQL API" -msgstr "" - -#. js-lingui-id: kx0s+n -#: src/case-studies/case-study-stories.ts -msgid "Results" -msgstr "" - -#. js-lingui-id: 2itg0p -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Retro 2015" -msgstr "" - -#. js-lingui-id: H0dEn+ -#: src/app-preview/stage/flying-traffic-lights.tsx -msgid "Return traffic light" -msgstr "" - -#. js-lingui-id: k2x4+M -#: src/platform/releases/release-notes.tsx -msgid "Revamp View Options Menu" -msgstr "" - -#. js-lingui-id: 7xiRJz -#: src/platform/releases/release-notes.tsx -msgid "Revamped Navigation Bar" -msgstr "" - -#. js-lingui-id: lHXjXQ -#: src/platform/releases/release-notes.tsx -msgid "Revamped Side Panel" -msgstr "" - -#. js-lingui-id: frqduN -#: src/sections/product-feature/feature-tiles.ts -msgid "Rich notes attached to records" -msgstr "" - -#. js-lingui-id: i4ofLR -#: src/platform/releases/release-notes.tsx -msgid "Rich text layouts" -msgstr "" - -#. js-lingui-id: /gaSVU -#: src/case-studies/case-study-stories.ts -msgid "Roadmap" -msgstr "" - -#. js-lingui-id: mLp5AP -#: src/partner-application/data/partner-country-options.ts -msgid "Romania 🇷🇴" -msgstr "" - -#. js-lingui-id: uJc01W -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Romanian" -msgstr "" - -#. js-lingui-id: Wdh41P -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Row-level permissions" -msgstr "" - -#. js-lingui-id: mRpuWW -#: src/case-studies/case-study-stories.ts -msgid "Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks." -msgstr "" - -#. js-lingui-id: T1ut28 -#: src/partner-application/data/partner-country-options.ts -msgid "Russia 🇷🇺" -msgstr "" - -#. js-lingui-id: nji0/X -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Russian" -msgstr "" - -#. js-lingui-id: dw8D3T -#: src/partner-application/data/partner-country-options.ts -msgid "Rwanda 🇷🇼" -msgstr "" - -#. js-lingui-id: niLOap -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Kitts & Nevis 🇰🇳" -msgstr "" - -#. js-lingui-id: zCHzF/ -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Lucia 🇱🇨" -msgstr "" - -#. js-lingui-id: Md/8iQ -#: src/partner-application/data/partner-country-options.ts -msgid "Saint Vincent 🇻🇨" -msgstr "" - -#. js-lingui-id: Burn4/ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesfarce Add-on Center" -msgstr "" - -#. js-lingui-id: xTfEgV -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesfarce Pro" -msgstr "" - -#. js-lingui-id: /UolBB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Salesforce Classic" -msgstr "" - -#. js-lingui-id: l69E+u -#: src/case-studies/case-study-catalog.ts -msgid "Salesforce migration" -msgstr "" - -#. js-lingui-id: CADlRK -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same CRM" -msgstr "" - -#. js-lingui-id: 60i6S+ -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same output" -msgstr "" - -#. js-lingui-id: xl2tJ9 -#: src/sections/why-twenty-marquee/why-twenty-marquee.tsx -msgid "Same results" -msgstr "" - -#. js-lingui-id: w9QWxz -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "SAML/OIDC SSO" -msgstr "" - -#. js-lingui-id: R38ZPo -#: src/partner-application/data/partner-country-options.ts -msgid "Samoa 🇼🇸" -msgstr "" - -#. js-lingui-id: fK288K -#: src/partner-application/data/partner-country-options.ts -msgid "San Marino 🇸🇲" -msgstr "" - -#. js-lingui-id: KDcBQd -#: src/partner-application/data/partner-country-options.ts -msgid "São Tomé & Príncipe 🇸🇹" -msgstr "" - -#. js-lingui-id: /BK0Nl -#: src/partner-application/data/partner-country-options.ts -msgid "Saudi Arabia 🇸🇦" -msgstr "" - -#. js-lingui-id: elz5ka -#: src/case-studies/case-study-catalog.ts -msgid "Saved / month" -msgstr "" - -#. js-lingui-id: h3C5H8 -#: src/platform/releases/release-notes.tsx -msgid "Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace." -msgstr "" - -#. js-lingui-id: bifv6N -#: src/case-studies/case-study-stories.ts -msgid "Scale" -msgstr "" - -#. js-lingui-id: aI/fdL -#: src/case-studies/case-study-stories.ts -msgid "Scale without *breaking operations*" -msgstr "" - -#. js-lingui-id: 842ybw -#: src/case-studies/case-study-stories.ts -msgid "Scale without breaking operations" -msgstr "" - -#. js-lingui-id: vk6sVR -#: src/partner-application/partner-application-copy.ts -msgid "Search a country…" -msgstr "" - -#. js-lingui-id: +yNkue -#: src/platform/releases/release-notes.tsx -msgid "Search in field pickers and add-column menus makes table and layout customization faster." -msgstr "" - -#. js-lingui-id: HVOGoW -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Seats limit" -msgstr "" - -#. js-lingui-id: a3LDKx -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Security" -msgstr "" - -#. js-lingui-id: nmVU/t -#: src/sections/customers-hero/customers-hero.tsx -msgid "" -"See how teams\n" -"build *on Twenty*" -msgstr "" - -#. js-lingui-id: aB+XpI -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "See more features" -msgstr "" - -#. js-lingui-id: JDp1bg -#: src/sections/three-cards/product-three-cards-data.ts -msgid "See updates as they happen. Work with your team and agents seamlessly." -msgstr "" - -#. js-lingui-id: 0kgOPB -#. placeholder {0}: LATEST_RELEASE.release -#: src/sections/menu/menu.data.ts -msgid "See what shipped in {0}" -msgstr "Découvrez les nouveautés de la {0}" - -#. js-lingui-id: 02ePaq -#. placeholder {0}: company.name -#: src/sections/product-feature/contacts-visual.tsx -msgid "Select {0}" -msgstr "" - -#. js-lingui-id: wgNoIs -#: src/sections/pricing-salesfarce/salesfarce-window.tsx -msgid "Select all" -msgstr "" - -#. js-lingui-id: 6p/m5q -#: src/partner-application/partner-application-copy.ts -msgid "Select your country" -msgstr "" - -#. js-lingui-id: sXYD/i -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "self" -msgstr "" - -#. js-lingui-id: 6JhL+3 -#: src/case-studies/case-study-catalog.ts -msgid "Self-hosted" -msgstr "" - -#. js-lingui-id: QFK/45 -#: src/partner-application/data/partner-scope-options.ts -msgid "Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring" -msgstr "" - -#. js-lingui-id: 42Nf4Y -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted *means control*" -msgstr "" - -#. js-lingui-id: zuU9UU -#: src/platform/releases/release-notes.tsx -msgid "Self-hosted billing" -msgstr "" - -#. js-lingui-id: 5CWy3T -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs." -msgstr "" - -#. js-lingui-id: 5WmQ5O -#: src/case-studies/case-study-stories.ts -msgid "Self-hosted means control" -msgstr "" - -#. js-lingui-id: WxVgfh -#: src/platform/releases/release-notes.tsx -msgid "Self-hosted workspaces can now track usage more cleanly with usage-based billing support." -msgstr "" - -#. js-lingui-id: GrBvv/ -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Self-hosting" -msgstr "" - -#. js-lingui-id: YdhUoe -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Self-hosting, now for rent!" -msgstr "" - -#. js-lingui-id: uVBq8r -#: src/platform/releases/release-notes.tsx -msgid "Self-Onboarding" -msgstr "" - -#. js-lingui-id: NaHz2o -#: src/sections/pricing-plans/self-host-toggle.tsx -msgid "Selfhosting" -msgstr "" - -#. js-lingui-id: pi1oME -#: src/app-preview/terminal/terminal-send-button.tsx -msgid "Send message" -msgstr "" - -#. js-lingui-id: D50Vyu -#: src/partner-application/data/partner-country-options.ts -msgid "Senegal 🇸🇳" -msgstr "" - -#. js-lingui-id: eEJlq0 -#: src/partner-application/data/partner-country-options.ts -msgid "Serbia 🇷🇸" -msgstr "" - -#. js-lingui-id: 62gxWx -#: src/partner-application/data/partner-country-options.ts -msgid "Seychelles 🇸🇨" -msgstr "" - -#. js-lingui-id: 3VFzsh -#: src/sections/helped/helped.data.ts -msgid "Ship a product on Twenty" -msgstr "Lancez un produit sur Twenty" - -#. js-lingui-id: Ta0ts5 -#: src/app-preview/terminal/diff/diff-pill.tsx -msgid "Show changes" -msgstr "" - -#. js-lingui-id: 6lGV3K -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Show less" -msgstr "" - -#. js-lingui-id: RhU4bB -#: src/partners-marketplace/filter-bar.tsx -msgid "Showing {visibleCount} of {totalCount} partners" -msgstr "" - -#. js-lingui-id: I89wN/ -#: src/partners-marketplace/filter-bar.tsx -msgid "Showing all {totalCount} partners" -msgstr "" - -#. js-lingui-id: 9k9PMD -#: src/platform/releases/release-notes.tsx -msgid "Sidebar items" -msgstr "" - -#. js-lingui-id: yhyNch -#: src/partner-application/data/partner-country-options.ts -msgid "Sierra Leone 🇸🇱" -msgstr "" - -#. js-lingui-id: mA6cL1 -#: src/sections/faq/faq.data.ts -msgid "Sign up for Cloud in under a minute and start your 30-day trial. For larger rollouts, our 4-hour Onboarding Packs or certified partners get you live in 1–2 weeks." -msgstr "Inscrivez-vous au Cloud en moins d'une minute et commencez votre essai de 30 jours. Pour les déploiements plus larges, nos packs d'onboarding de 4 heures ou nos partenaires certifiés vous mettent en production en 1 à 2 semaines." - -#. js-lingui-id: qTFDyz -#: src/sections/pricing-plans/pricing-intro.tsx -msgid "" -"Simple\n" -"*Pricing*" -msgstr "" - -#. js-lingui-id: 0eG5g+ -#: src/partner-application/data/partner-country-options.ts -msgid "Singapore 🇸🇬" -msgstr "" - -#. js-lingui-id: V9dFwD -#: src/sections/footer/footer.data.ts -msgid "Sitemap" -msgstr "Plan du site" - -#. js-lingui-id: c+cRP3 -#: src/platform/releases/release-notes.tsx -msgid "Skeleton Loading" -msgstr "" - -#. js-lingui-id: PCSkw2 -#: src/partners-marketplace/partner-profile.tsx -msgid "Skills" -msgstr "" - -#. js-lingui-id: t6ComU -#: src/sections/feature-cards/feature-cards.tsx -msgid "Skip the clunky UX that always comes with custom." -msgstr "Évitez l'UX laborieuse qui accompagne toujours le sur-mesure." - -#. js-lingui-id: U7keXg -#: src/partner-application/data/partner-country-options.ts -msgid "Slovakia 🇸🇰" -msgstr "" - -#. js-lingui-id: o1VTTF -#: src/partner-application/data/partner-country-options.ts -msgid "Slovenia 🇸🇮" -msgstr "" - -#. js-lingui-id: 1v/aHN -#: src/platform/releases/release-notes.tsx -msgid "Smart ⌘K" -msgstr "" - -#. js-lingui-id: bUmSwL -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute." -msgstr "Des modèles intelligents, des raccourcis et des mises en page rendent les tâches quotidiennes plus rapides et plus simples à exécuter." - -#. js-lingui-id: GUqjZ0 -#: src/sections/footer/footer-bottom.tsx -msgid "Social media" -msgstr "Réseaux sociaux" - -#. js-lingui-id: b+F/Ih -#: src/platform/releases/release-notes.tsx -msgid "Soft Delete" -msgstr "" - -#. js-lingui-id: L58Ivq -#: src/platform/releases/release-notes.tsx -msgid "Soft delete feature added: Deleted records are now hidden from view but recoverable from the \"Deleted record\" option in any object options menu. No more drama!" -msgstr "" - -#. js-lingui-id: 6sKjjx -#: src/partner-application/data/partner-team-type-options.ts -msgid "Solo" -msgstr "" - -#. js-lingui-id: FX2oa1 -#: src/partner-application/partner-application-copy.ts -msgid "Solo or agency?" -msgstr "" - -#. js-lingui-id: TcZtfs -#: src/partner-application/data/partner-country-options.ts -msgid "Solomon Islands 🇸🇧" -msgstr "" - -#. js-lingui-id: TvdMI3 -#: src/partners-marketplace/partner-scope-labels.ts -#: src/partner-application/data/partner-scope-options.ts -msgid "Solutioning" -msgstr "" - -#. js-lingui-id: t1E06j -#: src/partner-application/data/partner-country-options.ts -msgid "Somalia 🇸🇴" -msgstr "" - -#. js-lingui-id: AVfp38 -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons." -msgstr "" - -#. js-lingui-id: Lllsp+ -#: src/platform/releases/release-notes.tsx -msgid "Some teammate changes now appear right away, so collaboration feels faster and more up to date." -msgstr "" - -#. js-lingui-id: B/mYo/ -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Source code access" -msgstr "" - -#. js-lingui-id: zHJB/O -#: src/partner-application/data/partner-country-options.ts -msgid "South Africa 🇿🇦" -msgstr "" - -#. js-lingui-id: 7MdTKh -#: src/partner-application/data/partner-country-options.ts -msgid "South Korea 🇰🇷" -msgstr "" - -#. js-lingui-id: a4jo+V -#: src/partner-application/data/partner-country-options.ts -msgid "South Sudan 🇸🇸" -msgstr "" - -#. js-lingui-id: Kv3C8d -#: src/partner-application/data/partner-country-options.ts -msgid "Spain 🇪🇸" -msgstr "" - -#. js-lingui-id: 65A04M -#: src/partners-marketplace/spoken-language-labels.ts -#: src/partner-application/data/partner-language-options.ts -msgid "Spanish" -msgstr "" - -#. js-lingui-id: 00jcbn -#: src/partner-application/data/partner-country-options.ts -msgid "Sri Lanka 🇱🇰" -msgstr "" - -#. js-lingui-id: vnS6Rf -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "SSO" -msgstr "" - -#. js-lingui-id: uQl22y -#: src/sections/pricing-plans/plans-data.ts -#: src/sections/pricing-plans/plans-data.ts -msgid "Standard support" -msgstr "" - -#. js-lingui-id: wxW2Sv -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Start automating at huge scale!" -msgstr "" - -#. js-lingui-id: XO628f -#: src/sections/pricing-plans/plan-card.tsx -msgid "Start for free" -msgstr "" - -#. js-lingui-id: sBOFB0 -#: src/sections/pricing-plans/pricing-intro.tsx -msgid "" -"Start your free trial today\n" -"without credit card." -msgstr "" - -#. js-lingui-id: ThcPyu -#: src/sections/stepper/stepper.data.ts -msgid "Stay in control with our *open-source software*" -msgstr "Gardez le contrôle avec notre *logiciel open source*" - -#. js-lingui-id: j9c8rb -#: src/sections/three-cards/product-three-cards-data.ts -msgid "Stay in Flow" -msgstr "" - -#. js-lingui-id: GdGiNi -#: src/partner-application/partner-application-copy.ts -msgid "Step {current} of {total}" -msgstr "" - -#. js-lingui-id: bxgoJR -#: src/sections/menu/menu.data.ts -msgid "Step-by-step guides and playbooks to help your team get the most out of their workspace." -msgstr "Des guides pas à pas et des playbooks pour aider votre équipe à tirer le meilleur de son espace de travail." - -#. js-lingui-id: jKt86V -#: src/sections/faq/faq.tsx -msgid "Stop fighting custom. *Start building, with Twenty*" -msgstr "Cessez de lutter contre le sur-mesure. *Commencez à construire, avec Twenty*" - -#. js-lingui-id: UCLArd -#: src/sections/three-cards/three-cards.tsx -#: src/sections/three-cards/product-three-cards.tsx -msgid "Stop settling for trade-offs." -msgstr "Cessez de vous contenter de compromis." - -#. js-lingui-id: hjgBcp -#: src/platform/releases/release-notes.tsx -msgid "Stop Workflow Button" -msgstr "" - -#. js-lingui-id: 3QIOGT -#: src/platform/releases/release-notes.tsx -msgid "Sub-field Filtering" -msgstr "" - -#. js-lingui-id: eVPr22 -#: src/platform/releases/release-notes.tsx -msgid "Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field." -msgstr "" - -#. js-lingui-id: Sv4BSp -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Subdomain (yourco.twenty.com)" -msgstr "" - -#. js-lingui-id: H5/rZQ -#: src/partner-application/partner-application-copy.ts -msgid "Submit application" -msgstr "" - -#. js-lingui-id: MDqQmP -#: src/partner-application/partner-application-copy.ts -msgid "Submitting…" -msgstr "" - -#. js-lingui-id: 8Z1557 -#: src/partner-application/data/partner-country-options.ts -msgid "Sudan 🇸🇩" -msgstr "" - -#. js-lingui-id: XYLcNv -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Support" -msgstr "" - -#. js-lingui-id: Aq66kg -#: src/partner-application/data/partner-country-options.ts -msgid "Suriname 🇸🇷" -msgstr "" - -#. js-lingui-id: Yz+oFV -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Swahili" -msgstr "" - -#. js-lingui-id: 6u3kqB -#: src/sections/pricing-plan-table/plan-table-visible-rows.test.ts -msgid "swap" -msgstr "" - -#. js-lingui-id: b2//Ip -#: src/partner-application/data/partner-country-options.ts -msgid "Sweden 🇸🇪" -msgstr "" - -#. js-lingui-id: UaISq3 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Swedish" -msgstr "" - -#. js-lingui-id: IImT5c -#: src/partner-application/data/partner-country-options.ts -msgid "Switzerland 🇨🇭" -msgstr "" - -#. js-lingui-id: sjuSub -#: src/partner-application/data/partner-country-options.ts -msgid "Syria 🇸🇾" -msgstr "" - -#. js-lingui-id: 3w+Aox -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Table, Kanban, Calendar" -msgstr "" - -#. js-lingui-id: ISVD3+ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Tagalog" -msgstr "" - -#. js-lingui-id: 9M02G5 -#: src/sections/stepper/product-stepper-data.ts -msgid "Tailor record pages, menus, and views" -msgstr "" - -#. js-lingui-id: boABlR -#: src/partner-application/data/partner-country-options.ts -msgid "Taiwan 🇹🇼" -msgstr "" - -#. js-lingui-id: XJspRJ -#: src/partner-application/data/partner-country-options.ts -msgid "Tajikistan 🇹🇯" -msgstr "" - -#. js-lingui-id: jYsF4G -#: src/platform/releases/release-notes.tsx -msgid "Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time." -msgstr "" - -#. js-lingui-id: JAKtcG -#: src/sections/product-hero/product-hero.tsx -#: src/sections/home-hero/home-hero.tsx -#: src/sections/footer/footer.data.ts -#: src/sections/faq/faq.tsx -#: src/sections/customers-catalog-signoff/customers-catalog-signoff.tsx -#: src/sections/case-study-detail/customers-case-study-signoff.tsx -#: src/contact-cal/contact-cal-modal.tsx -msgid "Talk to us" -msgstr "Parlez-nous" - -#. js-lingui-id: fb427h -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Tamil" -msgstr "" - -#. js-lingui-id: ri1l89 -#: src/partner-application/data/partner-country-options.ts -msgid "Tanzania 🇹🇿" -msgstr "" - -#. js-lingui-id: GWMpL3 -#: src/sections/product-feature/feature-tiles.ts -msgid "Tasks & Activities" -msgstr "" - -#. js-lingui-id: Ye3KKA -#: src/sections/menu/menu.data.ts -msgid "Team up with a Twenty expert" -msgstr "Faites équipe avec un expert Twenty" - -#. js-lingui-id: vsdUaL -#: src/sections/releases-hero/releases-hero.tsx -msgid "Technical notes" -msgstr "" - -#. js-lingui-id: y+bLyB -#: src/partner-application/partner-application-copy.ts -msgid "Technical skills" -msgstr "" - -#. js-lingui-id: Hevu8X -#: src/app-preview/terminal/terminal-toggle.tsx -msgid "Terminal mode" -msgstr "" - -#. js-lingui-id: mvP/25 -#: src/sections/footer/footer.data.ts -msgid "Terms and Conditions" -msgstr "Conditions générales" - -#. js-lingui-id: xowcRf -#: src/app/[locale]/(site)/terms/page.tsx -msgid "Terms of Service" -msgstr "" - -#. js-lingui-id: BEX1RA -#: src/platform/routing/static-website-routes.ts -msgid "Terms of Service | Twenty" -msgstr "" - -#. js-lingui-id: VUZDlr -#: src/sections/testimonials/testimonials-carousel.tsx -msgid "Testimonials" -msgstr "Témoignages" - -#. js-lingui-id: SUr44j -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Thai" -msgstr "" - -#. js-lingui-id: 6t7gpr -#: src/partner-application/data/partner-country-options.ts -msgid "Thailand 🇹🇭" -msgstr "" - -#. js-lingui-id: Pa/Y6/ -#: src/partner-application/partner-application-copy.ts -msgid "" -"Thanks, you're in.\n" -"*Now book your intro call.*" -msgstr "" - -#. js-lingui-id: FjkPYg -#: src/case-studies/case-study-stories.ts -msgid "That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients." -msgstr "" - -#. js-lingui-id: 8S4psU -#: src/case-studies/case-study-stories.ts -msgid "That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer." -msgstr "" - -#. js-lingui-id: zXlFuT -#: src/platform/routing/static-website-routes.ts -msgid "The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business." -msgstr "Le CRM open source nº 1 pour les équipes modernes. Modulaire, évolutif et conçu pour épouser votre activité." - -#. js-lingui-id: K1T7Mn -#: src/platform/releases/release-notes.tsx -msgid "The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record." -msgstr "" - -#. js-lingui-id: KzqOXm -#: src/platform/releases/release-notes.tsx -msgid "The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \"Retail,\" \"Technology,\" and \"Finance,\" enabling more nuanced segmentation and analysis." -msgstr "" - -#. js-lingui-id: 6wVgAW -#: src/case-studies/case-study-stories.ts -msgid "The bet is *paying off*" -msgstr "" - -#. js-lingui-id: NT2bSJ -#: src/case-studies/case-study-stories.ts -msgid "The bet is paying off" -msgstr "" - -#. js-lingui-id: Wie492 -#: src/case-studies/case-study-stories.ts -msgid "The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in." -msgstr "" - -#. js-lingui-id: 2kHqXc -#: src/case-studies/case-study-stories.ts -msgid "The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them." -msgstr "" - -#. js-lingui-id: EYi+kT -#: src/case-studies/case-study-stories.ts -msgid "The CRM as a *control hub*" -msgstr "" - -#. js-lingui-id: 2sfVd8 -#: src/case-studies/case-study-stories.ts -msgid "The CRM as a control hub" -msgstr "" - -#. js-lingui-id: XlFsoH -#: src/case-studies/case-study-stories.ts -msgid "The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant." -msgstr "" - -#. js-lingui-id: kCUcnD -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed." -msgstr "" - -#. js-lingui-id: MaHqAc -#: src/sections/testimonials/testimonials.data.ts -#: src/case-studies/case-study-stories.ts -msgid "The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly." -msgstr "C'est vraiment la flexibilité qui a fait la différence. Nos besoins évoluent très vite. Je découvre un nouveau besoin et en deux clics j'y réponds. C'est un vrai avantage quand on avance vite." - -#. js-lingui-id: Q5iZ9Q -#: src/case-studies/case-study-stories.ts -msgid "The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy." -msgstr "" - -#. js-lingui-id: l0eUFC -#: src/case-studies/case-study-stories.ts -msgid "The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever." -msgstr "" - -#. js-lingui-id: SW9clW -#: src/sections/why-twenty-hero/why-twenty-hero.tsx -msgid "The future of CRM is built, *not bought.*" -msgstr "" - -#. js-lingui-id: sm10Rg -#: src/sections/problem/problem.data.ts -msgid "The Giant Monolith" -msgstr "Le monolithe géant" - -#. js-lingui-id: nFB8I1 -#: src/sections/problem/problem.data.ts -msgid "The In-house Burden" -msgstr "Le fardeau du fait-maison" - -#. js-lingui-id: ZNzKXV -#: src/case-studies/case-study-stories.ts -msgid "The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic." -msgstr "" - -#. js-lingui-id: nf1NnD -#: src/platform/releases/release-notes.tsx -msgid "The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields." -msgstr "" - -#. js-lingui-id: tADBQB -#: src/platform/releases/release-notes.tsx -msgid "The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads." -msgstr "" - -#. js-lingui-id: q1kKLq -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "The opportunity" -msgstr "" - -#. js-lingui-id: 80f4ed -#: src/sections/menu/menu.data.ts -msgid "The principles and product philosophy behind the open source CRM." -msgstr "Les principes et la philosophie produit derrière le CRM open source." - -#. js-lingui-id: 2NJdyz -#: src/sections/problem/problem.tsx -msgid "The Problem." -msgstr "Le problème." - -#. js-lingui-id: GTy93s -#: src/platform/releases/release-notes.tsx -msgid "The record page now features a clearer layout with increased space for content" -msgstr "" - -#. js-lingui-id: 3/wAFg -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "The result" -msgstr "" - -#. js-lingui-id: nAWeyi -#: src/case-studies/case-study-stories.ts -msgid "The result is a system that fits how AC&T already worked, instead of the other way around." -msgstr "" - -#. js-lingui-id: WENmFq -#: src/case-studies/case-study-stories.ts -msgid "The right *foundation*" -msgstr "" - -#. js-lingui-id: nbHA9N -#: src/case-studies/case-study-stories.ts -msgid "The right foundation" -msgstr "" - -#. js-lingui-id: g8h2v+ -#: src/platform/releases/release-notes.tsx -msgid "The search feature now includes ranking scores. This helps you find the most relevant results faster." -msgstr "" - -#. js-lingui-id: 9CCRtB -#: src/platform/releases/release-notes.tsx -msgid "The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results." -msgstr "" - -#. js-lingui-id: omVXTg -#: src/case-studies/case-study-stories.ts -msgid "The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source." -msgstr "" - -#. js-lingui-id: 1tN3qf -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "The shift" -msgstr "" - -#. js-lingui-id: iW6MjB -#: src/platform/releases/release-notes.tsx -msgid "The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature." -msgstr "" - -#. js-lingui-id: AnGOwN -#: src/case-studies/case-study-stories.ts -msgid "The situation" -msgstr "" - -#. js-lingui-id: gXGp3Q -#: src/sections/menu/menu.data.ts -msgid "The story behind Twenty" -msgstr "L'histoire derrière Twenty" - -#. js-lingui-id: axo4rg -#: src/platform/routing/static-website-routes.ts -msgid "The terms governing your use of Twenty and its open source CRM services." -msgstr "" - -#. js-lingui-id: xCAT8U -#: src/platform/releases/release-notes.tsx -msgid "The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events" -msgstr "" - -#. js-lingui-id: u0uFxg -#: src/sections/testimonials/testimonials-carousel.tsx -msgid "They are the real sales" -msgstr "Eux, ce sont les vraies ventes" - -#. js-lingui-id: 53RXLB -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "They call it customer loyalty. We call it a very affectionate cage." -msgstr "" - -#. js-lingui-id: RhmZMe -#: src/case-studies/case-study-stories.ts -msgid "They did not just replace a tool. They took back ownership of how their business runs." -msgstr "" - -#. js-lingui-id: ZnqwXn -#: src/case-studies/case-study-stories.ts -msgid "They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother." -msgstr "" - -#. js-lingui-id: 5YzqyT -#: src/case-studies/case-study-stories.ts -msgid "They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control." -msgstr "" - -#. js-lingui-id: AUV+TY -#: src/app-preview/terminal/thinking-indicator.tsx -msgid "Thinking" -msgstr "" - -#. js-lingui-id: 8gek0+ -#: src/platform/releases/release-notes.tsx -msgid "This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate." -msgstr "" - -#. js-lingui-id: 6f8QUY -#: src/partner-application/data/partner-country-options.ts -msgid "Timor-Leste 🇹🇱" -msgstr "" - -#. js-lingui-id: WwTFtc -#: src/platform/releases/release-notes.tsx -msgid "To enhance privacy, you can now add specific email addresses to a blocklist within the \"Accounts\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals." -msgstr "" - -#. js-lingui-id: ijf9QM -#: src/platform/releases/release-notes.tsx -msgid "To maintain the simplicity of Twenty, we are introducing \"Advanced Settings.\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings." -msgstr "" - -#. js-lingui-id: DeTupk -#: src/partner-application/data/partner-country-options.ts -msgid "Togo 🇹🇬" -msgstr "" - -#. js-lingui-id: CocxTO -#: src/partner-application/data/partner-country-options.ts -msgid "Tonga 🇹🇴" -msgstr "" - -#. js-lingui-id: 5eFktS -#: src/case-studies/case-study-catalog.ts -msgid "Tool integration" -msgstr "" - -#. js-lingui-id: xv7HSr -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "total per month with fixed cost" -msgstr "" - -#. js-lingui-id: hmu++i -#: src/sections/product-feature/feature-tiles.ts -msgid "Track amount and close date" -msgstr "" - -#. js-lingui-id: POzmFl -#: src/sections/menu/menu.data.ts -msgid "Track every release with changelogs, highlights and demos of the newest features." -msgstr "Suivez chaque version avec changelogs, temps forts et démos des dernières fonctionnalités." - -#. js-lingui-id: 6vHPh9 -#: src/sections/product-hero/product-hero.tsx -msgid "Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence." -msgstr "" - -#. js-lingui-id: xwWQ9Q -#: src/partners-marketplace/partner-scope-labels.ts -msgid "Training & Adoption" -msgstr "" - -#. js-lingui-id: MtCqjl -#: src/partner-application/data/partner-scope-options.ts -msgid "Training, Adoption & Support" -msgstr "" - -#. js-lingui-id: VhVAzf -#: src/platform/releases/release-notes.tsx -msgid "Translation in 30+ Languages" -msgstr "" - -#. js-lingui-id: /ga9kq -#: src/partner-application/data/partner-country-options.ts -msgid "Trinidad & Tobago 🇹🇹" -msgstr "" - -#. js-lingui-id: tdZpCd -#: src/sections/footer/footer.data.ts -msgid "Trust Center" -msgstr "Centre de confiance" - -#. js-lingui-id: HlusPQ -#: src/sections/pricing-salesfarce/pricing-salesfarce.tsx -msgid "Trust the n°1 CRM, *or not!*" -msgstr "" - -#. js-lingui-id: KtyN0b -#: src/sections/trusted-by/trusted-by.tsx -msgid "trusted by" -msgstr "ils nous font confiance" - -#. js-lingui-id: QZdPWP -#: src/sections/trusted-by/trusted-by.tsx -msgid "Trusted by leading organizations" -msgstr "Des organisations de premier plan nous font confiance" - -#. js-lingui-id: eslLQF -#: src/sections/product-demo/product-demo.tsx -msgid "Try it live" -msgstr "" - -#. js-lingui-id: qhmtws -#: src/partners-marketplace/empty-state.tsx -msgid "Try removing some filters or browse all partners." -msgstr "" - -#. js-lingui-id: E/hGy3 -#: src/sections/product-demo/product-demo.tsx -msgid "Try Twenty Cloud" -msgstr "" - -#. js-lingui-id: D5Kf4t -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours." -msgstr "" - -#. js-lingui-id: y4UxlS -#: src/partner-application/data/partner-country-options.ts -msgid "Tunisia 🇹🇳" -msgstr "" - -#. js-lingui-id: UIDKnJ -#: src/partner-application/data/partner-country-options.ts -msgid "Turkey 🇹🇷" -msgstr "" - -#. js-lingui-id: Kz91g/ -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Turkish" -msgstr "" - -#. js-lingui-id: kdJl4v -#: src/partner-application/data/partner-country-options.ts -msgid "Turkmenistan 🇹🇲" -msgstr "" - -#. js-lingui-id: tSc/a3 -#: src/partner-application/data/partner-country-options.ts -msgid "Tuvalu 🇹🇻" -msgstr "" - -#. js-lingui-id: O5dAmW -#: src/platform/routing/static-website-routes.ts -msgid "Twenty | #1 Open Source CRM" -msgstr "Twenty | CRM open source nº 1" - -#. js-lingui-id: NalB1c -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform." -msgstr "" - -#. js-lingui-id: fZsVj6 -#: src/case-studies/case-study-stories.ts -msgid "" -"Twenty as the\n" -"*API backbone* of a go-to-market stack" -msgstr "" - -#. js-lingui-id: +w9xZW -#: src/case-studies/case-study-catalog.ts -msgid "Twenty as the API backbone of a go-to-market stack" -msgstr "" - -#. js-lingui-id: zj0CA+ -#: src/case-studies/case-study-stories.ts -msgid "Twenty as the API backbone of a go-to-market stack | Elevate Consulting" -msgstr "" - -#. js-lingui-id: neM1Ol -#: src/platform/routing/static-website-routes.ts -msgid "Twenty CRM Features — Modern Open Source CRM Platform" -msgstr "" - -#. js-lingui-id: 8zCqPL -#: src/platform/routing/static-website-routes.ts -msgid "Twenty CRM Pricing — Plans from $9 per User per Month" -msgstr "" - -#. js-lingui-id: D05UQH -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Customers — How Modern Teams Run Their CRM" -msgstr "" - -#. js-lingui-id: MYHdd/ -#: src/case-studies/case-study-stories.ts -msgid "Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market." -msgstr "" - -#. js-lingui-id: fwep/o -#: src/case-studies/case-study-stories.ts -msgid "Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it." -msgstr "" - -#. js-lingui-id: 0qyMhk -#: src/sections/home-hero/home-hero.tsx -msgid "Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves." -msgstr "Twenty donne aux équipes techniques les briques pour construire un CRM sur mesure, qui répond aux besoins métier complexes et évolue avec l'entreprise." - -#. js-lingui-id: jVhq41 -#: src/sections/testimonials/partner-testimonials.data.ts -msgid "Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform." -msgstr "" - -#. js-lingui-id: x/I85y -#: src/case-studies/case-study-stories.ts -msgid "Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible." -msgstr "" - -#. js-lingui-id: zvfdHM -#: src/case-studies/case-study-stories.ts -msgid "Twenty is the heart of the system. Everything branches from it." -msgstr "" - -#. js-lingui-id: K+zzSQ -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "Twenty lets us build a CRM around the business and not the business around the CRM." -msgstr "" - -#. js-lingui-id: AxT+g4 -#: src/sections/feature-cards/feature-cards.data.ts -msgid "Twenty makes it simple. It's clean, intuitive, and built to feel like Notion." -msgstr "Twenty rend les choses simples. C'est épuré, intuitif et conçu pour rappeler Notion." - -#. js-lingui-id: mZ3xRm -#: src/sections/menu/menu.data.ts -msgid "Twenty partner ecosystem" -msgstr "Écosystème de partenaires Twenty" - -#. js-lingui-id: 4SJucz -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Partners — Certified Open Source CRM Implementers" -msgstr "" - -#. js-lingui-id: vD7S1X -#. placeholder {0}: LATEST_RELEASE.release -#. placeholder {1}: LATEST_RELEASE.title -#: src/sections/menu/menu.data.ts -msgid "Twenty release {0} — {1}" -msgstr "Version {0} de Twenty — {1}" - -#. js-lingui-id: X1GHuJ -#: src/platform/routing/static-website-routes.ts -msgid "Twenty Releases — What's New in the Open Source CRM" -msgstr "" - -#. js-lingui-id: V1lV7B -#: src/sections/pricing-plans/plans-data.ts -msgid "Twenty team support" -msgstr "" - -#. js-lingui-id: osa7Xg -#: src/sections/menu/menu.data.ts -msgid "Twenty user guide preview" -msgstr "Aperçu du guide d'utilisation de Twenty" - -#. js-lingui-id: KsFvUt -#: src/partners-marketplace/marketplace-header.tsx -msgid "Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call." -msgstr "" - -#. js-lingui-id: tuvLv1 -#: src/platform/releases/release-notes.tsx -msgid "Two Factor Authentication" -msgstr "" - -#. js-lingui-id: EIU345 -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Two-factor authentication" -msgstr "" - -#. js-lingui-id: O+vc/1 -#: src/partner-application/partner-application-copy.ts -msgid "Type of team *" -msgstr "" - -#. js-lingui-id: P+R1Lc -#: src/partners-marketplace/partner-rates-panel.tsx -msgid "Typical project" -msgstr "" - -#. js-lingui-id: HqFilh -#: src/partner-application/data/partner-country-options.ts -msgid "UAE 🇦🇪" -msgstr "" - -#. js-lingui-id: +WNTxL -#: src/partner-application/data/partner-country-options.ts -msgid "Uganda 🇺🇬" -msgstr "" - -#. js-lingui-id: uxuy4l -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "UI theme" -msgstr "" - -#. js-lingui-id: tNfmmF -#: src/partner-application/data/partner-country-options.ts -msgid "UK 🇬🇧" -msgstr "" - -#. js-lingui-id: z7UkhA -#: src/partner-application/data/partner-country-options.ts -msgid "Ukraine 🇺🇦" -msgstr "" - -#. js-lingui-id: V9+2pH -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Ukrainian" -msgstr "" - -#. js-lingui-id: jqzUyM -#: src/sections/pricing-salesfarce/salesfarce-data.ts -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Unavailable" -msgstr "" - -#. js-lingui-id: Hix/m6 -#: src/sections/product-feature/feature-tiles.ts -msgid "Unified timeline (emails, events, tasks, notes, files)" -msgstr "" - -#. js-lingui-id: NIuIk1 -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Unlimited" -msgstr "" - -#. js-lingui-id: q7vKOJ -#: src/platform/releases/release-notes.tsx -msgid "Unlisted Views" -msgstr "" - -#. js-lingui-id: aGpTSC -#: src/sections/pricing-plans/plans-data.ts -msgid "Up to 5 workspaces" -msgstr "" - -#. js-lingui-id: KQsreu -#: src/platform/releases/release-notes.tsx -msgid "Updated by" -msgstr "" - -#. js-lingui-id: SPdRRU -#: src/partner-application/data/partner-scope-options.ts -msgid "Upfront consulting, scoping, strategy." -msgstr "" - -#. js-lingui-id: WLb3m4 -#: src/platform/releases/release-notes.tsx -msgid "Upgraded Search" -msgstr "" - -#. js-lingui-id: 2vanwz -#: src/sections/product-feature/feature-tiles.ts -msgid "Upload, rename, preview, and manage files directly on records. Everything stays where it belongs." -msgstr "" - -#. js-lingui-id: tmwuH9 -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Urdu" -msgstr "" - -#. js-lingui-id: huOaG8 -#: src/partner-application/data/partner-country-options.ts -msgid "Uruguay 🇺🇾" -msgstr "" - -#. js-lingui-id: RCOibx -#: src/partners-marketplace/served-geo-labels.ts -msgid "US" -msgstr "" - -#. js-lingui-id: LXHEIS -#: src/partner-application/data/partner-country-options.ts -msgid "USA 🇺🇸" -msgstr "" - -#. js-lingui-id: Roaswv -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -msgid "User Guide" -msgstr "Guide d'utilisation" - -#. js-lingui-id: 9iX1i3 -#: src/platform/releases/release-notes.tsx -msgid "User impersonation" -msgstr "" - -#. js-lingui-id: 3XIgKU -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "User roles" -msgstr "" - -#. js-lingui-id: UCUX2+ -#: src/partner-application/data/partner-scope-options.ts -msgid "User-side rollout & ongoing support." -msgstr "" - -#. js-lingui-id: FOOEtP -#: src/partner-application/data/partner-country-options.ts -msgid "Uzbekistan 🇺🇿" -msgstr "" - -#. js-lingui-id: CRXL2j -#: src/partner-application/data/partner-country-options.ts -msgid "Vanuatu 🇻🇺" -msgstr "" - -#. js-lingui-id: NNeEYO -#: src/partner-application/data/partner-country-options.ts -msgid "Vatican 🇻🇦" -msgstr "" - -#. js-lingui-id: BWzac4 -#: src/partner-application/data/partner-country-options.ts -msgid "Venezuela 🇻🇪" -msgstr "" - -#. js-lingui-id: fDWr8s -#: src/platform/releases/release-notes.tsx -msgid "Version control" -msgstr "" - -#. js-lingui-id: FlQ1vR -#: src/partner-application/data/partner-country-options.ts -msgid "Vietnam 🇻🇳" -msgstr "" - -#. js-lingui-id: fROFIL -#: src/partners-marketplace/spoken-language-labels.ts -msgid "Vietnamese" -msgstr "" - -#. js-lingui-id: BRBSny -#. placeholder {0}: partner.name -#: src/partners-marketplace/partner-card.tsx -msgid "View {0} on LinkedIn" -msgstr "" - -#. js-lingui-id: V4nZs/ -#: src/platform/releases/release-notes.tsx -msgid "View Groups" -msgstr "" - -#. js-lingui-id: ITdNGt -#: src/partners-marketplace/partner-profile-ctas.tsx -msgid "View on LinkedIn" -msgstr "" - -#. js-lingui-id: 73lp8c -#: src/partners-marketplace/partner-card.tsx -msgid "View profile" -msgstr "" - -#. js-lingui-id: BAzC1v -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "View types" -msgstr "" - -#. js-lingui-id: mHtVst -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Visualize your customers on a map!" -msgstr "" - -#. js-lingui-id: CsHuOr -#: src/sections/three-cards/three-cards.data.ts -msgid "VP of Engineering" -msgstr "VP de l'ingénierie" - -#. js-lingui-id: uRh799 -#: src/sections/testimonials/testimonials.data.ts -msgid "VP of Engineering at W3villa Technologies" -msgstr "VP de l'ingénierie chez W3villa Technologies" - -#. js-lingui-id: w2INie -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-catalog.ts -msgid "VP of Engineering, W3villa Technologies" -msgstr "" - -#. js-lingui-id: s0tU5h -#: src/case-studies/case-study-stories.ts -msgid "W3Grads" -msgstr "" - -#. js-lingui-id: R8BueT -#: src/case-studies/case-study-stories.ts -msgid "W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone." -msgstr "" - -#. js-lingui-id: 7hHsoV -#: src/sections/helped/helped.data.ts -msgid "W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone." -msgstr "W3villa a construit W3Grads pour des simulations d'entretiens IA à grande échelle, avec Twenty comme colonne vertébrale opérationnelle." - -#. js-lingui-id: QBOUnd -#: src/case-studies/case-study-catalog.ts -msgid "W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing." -msgstr "" - -#. js-lingui-id: 7q5Vjn -#: src/sections/three-cards/three-cards.data.ts -msgid "W3villa Technologies" -msgstr "W3villa Technologies" - -#. js-lingui-id: ZabLEt -#: src/case-studies/case-study-stories.ts -msgid "W3villa Technologies set out to solve it properly, not with a workaround, but with a product." -msgstr "" - -#. js-lingui-id: 3v2ipf -#: src/sections/three-cards/three-cards.data.ts -msgid "W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves." -msgstr "W3villa a utilisé Twenty comme framework de niveau production pour le modèle de données, les permissions, l'authentification et le moteur de workflows qu'ils auraient sinon dû reconstruire eux-mêmes." - -#. js-lingui-id: k1Pevc -#: src/platform/releases/release-notes.tsx -msgid "We are pleased to reopen the cloud subscription to everyone. No more waiting!" -msgstr "" - -#. js-lingui-id: 8CHatv -#: src/partner-application/partner-application-copy.ts -msgid "We could not submit your application. Please try again in a moment." -msgstr "" - -#. js-lingui-id: ofRgSN -#: src/case-studies/case-study-stories.ts -msgid "We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." -msgstr "" - -#. js-lingui-id: MjWeUE -#: src/sections/testimonials/testimonials.data.ts -msgid "We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." -msgstr "Nous ne voulions pas rafistoler le problème. Nous voulions construire quelque chose sur lequel des institutions pourraient compter à grande échelle, et cela exigeait une fondation assez solide pour porter toute la complexité de notre vision." - -#. js-lingui-id: GVxbgf -#: src/platform/releases/release-notes.tsx -msgid "We have improved app performance, shaving off over 500ms on each page." -msgstr "" - -#. js-lingui-id: 6C4xTI -#: src/platform/releases/release-notes.tsx -msgid "We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks." -msgstr "" - -#. js-lingui-id: l7iJRt -#: src/platform/releases/release-notes.tsx -msgid "We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV." -msgstr "" - -#. js-lingui-id: d5CWI6 -#: src/sections/partner-hero/partner-hero.tsx -msgid "We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us." -msgstr "" - -#. js-lingui-id: DFlq8J -#: src/platform/releases/release-notes.tsx -msgid "We’ve added an \"any field search\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \"Mobile,\" \"Office,\" or \"Direct Line\" field." -msgstr "" - -#. js-lingui-id: kenNyf -#: src/platform/releases/release-notes.tsx -msgid "We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars." -msgstr "" - -#. js-lingui-id: 5CT1rV -#: src/platform/releases/release-notes.tsx -msgid "We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!" -msgstr "" - -#. js-lingui-id: xBnjMX -#: src/platform/releases/release-notes.tsx -msgid "We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well." -msgstr "" - -#. js-lingui-id: v1kQyJ -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Webhooks" -msgstr "" - -#. js-lingui-id: ZhnM/K -#: src/sections/pricing-salesfarce/salesfarce-data.ts -msgid "Webhooks (Change Data Capture)" -msgstr "" - -#. js-lingui-id: K4G86X -#: src/platform/releases/release-notes.tsx -msgid "Webhooks filter" -msgstr "" - -#. js-lingui-id: FaPmsq -#: src/platform/releases/release-notes.tsx -msgid "Webhooks multi-object filtering" -msgstr "" - -#. js-lingui-id: hgDePr -#: src/partner-application/partner-application-copy.ts -msgid "Website or GitHub" -msgstr "" - -#. js-lingui-id: Lx0cVD -#: src/partner-application/data/partner-scope-options.ts -msgid "What an admin can do without writing code." -msgstr "" - -#. js-lingui-id: Z34FQq -#: src/case-studies/case-study-stories.ts -msgid "What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company." -msgstr "" - -#. js-lingui-id: phiBjc -#: src/sections/faq/faq.data.ts -msgid "What does Twenty cost?" -msgstr "Combien coûte Twenty ?" - -#. js-lingui-id: WVQaGB -#: src/case-studies/case-study-stories.ts -msgid "What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible." -msgstr "" - -#. js-lingui-id: iOAq7n -#: src/case-studies/case-study-stories.ts -#: src/case-studies/case-study-stories.ts -msgid "What is next" -msgstr "" - -#. js-lingui-id: tWd6MT -#: src/case-studies/case-study-stories.ts -msgid "What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together." -msgstr "" - -#. js-lingui-id: kRfFDB -#: src/partners-marketplace/partner-profile.tsx -msgid "What they do" -msgstr "" - -#. js-lingui-id: aYRqmz -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "What this means" -msgstr "" - -#. js-lingui-id: QCHIzm -#: src/partner-application/partner-application-copy.ts -msgid "What you cover *" -msgstr "" - -#. js-lingui-id: 1kfjxX -#: src/case-studies/case-study-stories.ts -msgid "Whatever came next had to be something they could own." -msgstr "" - -#. js-lingui-id: cs6VpJ -#: src/case-studies/case-study-stories.ts -msgid "When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop." -msgstr "" - -#. js-lingui-id: chISDP -#: src/platform/releases/release-notes.tsx -msgid "When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects." -msgstr "" - -#. js-lingui-id: qqPUvu -#: src/case-studies/case-study-stories.ts -msgid "When the channel is *the business*" -msgstr "" - -#. js-lingui-id: JglRo/ -#: src/case-studies/case-study-stories.ts -msgid "When the channel is the business" -msgstr "" - -#. js-lingui-id: nkkLPM -#: src/case-studies/case-study-stories.ts -msgid "When the vendor *pulled the plug*" -msgstr "" - -#. js-lingui-id: DajeYD -#: src/case-studies/case-study-stories.ts -msgid "When the vendor pulled the plug" -msgstr "" - -#. js-lingui-id: 8SbakK -#: src/case-studies/case-study-stories.ts -msgid "" -"When your CRM is\n" -"*the product*" -msgstr "" - -#. js-lingui-id: OQ41z8 -#: src/case-studies/case-study-catalog.ts -msgid "When your CRM is the product" -msgstr "" - -#. js-lingui-id: Svuneu -#: src/case-studies/case-study-stories.ts -msgid "When your CRM is the product: W3Grads on Twenty | W3villa Technologies" -msgstr "" - -#. js-lingui-id: 2O07UN -#: src/partners-marketplace/partner-profile.tsx -msgid "Where & how" -msgstr "" - -#. js-lingui-id: bGN8u+ -#: src/case-studies/case-study-stories.ts -msgid "While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty." -msgstr "" - -#. js-lingui-id: DJlSwA -#: src/sections/menu/menu.data.ts -msgid "Why" -msgstr "Pourquoi" - -#. js-lingui-id: mrxgOV -#: src/sections/menu/menu.data.ts -msgid "Why teams choose Twenty" -msgstr "Pourquoi les équipes choisissent Twenty" - -#. js-lingui-id: 4sOVu+ -#: src/sections/footer/footer.data.ts -msgid "Why Twenty" -msgstr "Pourquoi Twenty" - -#. js-lingui-id: DH7vVZ -#: src/platform/routing/static-website-routes.ts -msgid "Why Twenty — The Open Source CRM Built to Be Customised" -msgstr "" - -#. js-lingui-id: tetjz4 -#: src/sections/menu/menu.data.ts -msgid "Why Twenty illustration" -msgstr "Illustration Pourquoi Twenty" - -#. js-lingui-id: 7KJZ0z -#: src/app-preview/stage/traffic-lights.tsx -msgid "Window controls" -msgstr "" - -#. js-lingui-id: V+BOYT -#: src/platform/releases/release-notes.tsx -msgid "With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control." -msgstr "" - -#. js-lingui-id: edwOmb -#: src/platform/releases/release-notes.tsx -msgid "With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines." -msgstr "" - -#. js-lingui-id: OKVlnc -#: src/case-studies/case-study-stories.ts -msgid "With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket." -msgstr "" - -#. js-lingui-id: OX5bbs -#: src/partner-application/partner-application-copy.ts -msgid "Work email *" -msgstr "" - -#. js-lingui-id: 5VGHpF -#: src/platform/releases/release-notes.tsx -msgid "Workflow branches" -msgstr "" - -#. js-lingui-id: 9MLcn+ -#: src/platform/releases/release-notes.tsx -msgid "Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation." -msgstr "" - -#. js-lingui-id: XYIks/ -#: src/platform/releases/release-notes.tsx -msgid "Workflow Bulk Select" -msgstr "" - -#. js-lingui-id: gDMfQI -#: src/platform/releases/release-notes.tsx -msgid "Workflow Filters" -msgstr "" - -#. js-lingui-id: aNVMLK -#: src/platform/releases/release-notes.tsx -msgid "Workflow improvements" -msgstr "" - -#. js-lingui-id: EnPi2W -#: src/platform/releases/release-notes.tsx -msgid "Workflow Iterator Node" -msgstr "" - -#. js-lingui-id: jN2u/p -#: src/platform/releases/release-notes.tsx -msgid "Workflow Search Node Limit" -msgstr "" - -#. js-lingui-id: woYYQq -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/platform/releases/release-notes.tsx -msgid "Workflows" -msgstr "" - -#. js-lingui-id: OteDxj -#: src/case-studies/case-study-stories.ts -msgid "Workflows that *actually get used*" -msgstr "" - -#. js-lingui-id: AzqmMJ -#: src/case-studies/case-study-stories.ts -msgid "Workflows that actually get used" -msgstr "" - -#. js-lingui-id: pmUArF -#: src/sections/pricing-plan-table/plan-table-data.ts -msgid "Workspace" -msgstr "" - -#. js-lingui-id: bwECg/ -#: src/partner-application/partner-application-copy.ts -msgid "Workspace URL, customer references, relevant links…" -msgstr "" - -#. js-lingui-id: p3ZD6C -#: src/sections/menu/menu.data.ts -#: src/sections/footer/footer.data.ts -#: src/sections/case-study-detail/case-study-article-nav.tsx -msgid "X (opens in new tab)" -msgstr "X (ouvre un nouvel onglet)" - -#. js-lingui-id: zkWmBh -#: src/sections/pricing-plans/billing-toggle.tsx -msgid "Yearly" -msgstr "" - -#. js-lingui-id: S6izIJ -#: src/partner-application/data/partner-country-options.ts -msgid "Yemen 🇾🇪" -msgstr "" - -#. js-lingui-id: l75CjT -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-data.ts -#: src/sections/pricing-plan-table/plan-table-content.tsx -msgid "Yes" -msgstr "" - -#. js-lingui-id: bo6pUs -#: src/sections/faq/faq.data.ts -msgid "Yes, with our Apps framework. Scaffold an extension with `npx create-twenty-app` and ship custom objects, server-side logic functions, React components that render inside Twenty’s UI, AI skills and agents, views, and navigation, all in TypeScript, deployable to any workspace." -msgstr "Oui, avec notre framework Apps. Générez une extension avec `npx create-twenty-app` et livrez objets personnalisés, fonctions de logique côté serveur, composants React rendus dans l’interface de Twenty, compétences et agents IA, vues et navigation — le tout en TypeScript, déployable sur n’importe quel espace de travail." - -#. js-lingui-id: yIcBW6 -#: src/sections/faq/faq.data.ts -msgid "Yes. Every Cloud workspace ships with a native MCP server. Connect your AI assistant via OAuth and it can read and write your CRM data in natural language." -msgstr "Oui. Chaque espace de travail Cloud embarque un serveur MCP natif. Connectez votre assistant IA via OAuth et il pourra lire et écrire vos données CRM en langage naturel." - -#. js-lingui-id: 8xYMYQ -#: src/sections/faq/faq.data.ts -msgid "Yes. Import your data via CSV, or use our API for 50,000+ records. Our partners can handle the full migration for you." -msgstr "Oui. Importez vos données via CSV, ou utilisez notre API au-delà de 50 000 enregistrements. Nos partenaires peuvent prendre en charge la migration complète." - -#. js-lingui-id: 8m0eN9 -#: src/sections/faq/faq.data.ts -msgid "Yes. Twenty is the #1 Open Source CRM on GitHub. You can self-host to fully own your infrastructure, or run it on our managed cloud for a zero-ops setup." -msgstr "Oui. Twenty est le CRM open source nº 1 sur GitHub. Auto-hébergez-le pour posséder pleinement votre infrastructure, ou utilisez notre cloud managé pour une exploitation zéro-ops." - -#. js-lingui-id: Q3GDrw -#: src/platform/releases/release-notes.tsx -msgid "You can now add your views to favorites for quick access and organize your favorites into folders for better management." -msgstr "" - -#. js-lingui-id: wvm+7M -#: src/platform/releases/release-notes.tsx -msgid "You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions." -msgstr "" - -#. js-lingui-id: Wg/o59 -#: src/platform/releases/release-notes.tsx -msgid "You can now create number fields that display a percentage instead of a regular number." -msgstr "" - -#. js-lingui-id: BAWUUs -#: src/platform/releases/release-notes.tsx -msgid "You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link." -msgstr "" - -#. js-lingui-id: nbc7CM -#: src/platform/releases/release-notes.tsx -msgid "You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)" -msgstr "" - -#. js-lingui-id: dCaNPC -#: src/platform/releases/release-notes.tsx -msgid "You can now edit one-to-many relations directly from the \"many side\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company." -msgstr "" - -#. js-lingui-id: HX2309 -#: src/platform/releases/release-notes.tsx -msgid "You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field." -msgstr "" - -#. js-lingui-id: /eqpqH -#: src/platform/releases/release-notes.tsx -msgid "You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created." -msgstr "" - -#. js-lingui-id: HeaQGk -#: src/platform/releases/release-notes.tsx -msgid "You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience." -msgstr "" - -#. js-lingui-id: l2z97k -#: src/platform/releases/release-notes.tsx -msgid "You can now link your Microsoft account to easily manage your messages and events right within your workspace." -msgstr "" - -#. js-lingui-id: QN6ytb -#: src/platform/releases/release-notes.tsx -msgid "You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection." -msgstr "" - -#. js-lingui-id: pYoGew -#: src/platform/releases/release-notes.tsx -msgid "You can now navigate from one object to another directly from the record detail page." -msgstr "" - -#. js-lingui-id: mpOPSr -#: src/platform/releases/release-notes.tsx -msgid "You can now preview file attachments without downloading them." -msgstr "" - -#. js-lingui-id: PoxYsC -#: src/platform/releases/release-notes.tsx -msgid "You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons." -msgstr "" - -#. js-lingui-id: S4LCu8 -#: src/platform/releases/release-notes.tsx -msgid "You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content." -msgstr "" - -#. js-lingui-id: uS4RtA -#: src/platform/releases/release-notes.tsx -msgid "You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently" -msgstr "" - -#. js-lingui-id: px+QAM -#: src/platform/releases/release-notes.tsx -msgid "You can now see who last updated a record" -msgstr "" - -#. js-lingui-id: OVoVQg -#: src/platform/releases/release-notes.tsx -msgid "You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace." -msgstr "" - -#. js-lingui-id: eheMXY -#: src/platform/releases/release-notes.tsx -msgid "You can now trigger workflows when a record is created or updated." -msgstr "" - -#. js-lingui-id: XEEpNj -#: src/platform/releases/release-notes.tsx -msgid "You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object." -msgstr "" - -#. js-lingui-id: LJ3sTb -#: src/sections/why-twenty-editorial/editorials.data.ts -msgid "You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter." -msgstr "" - -#. js-lingui-id: AUzqeZ -#: src/platform/releases/release-notes.tsx -msgid "You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows." -msgstr "" - -#. js-lingui-id: SfJVcK -#: src/sections/enterprise-activate/enterprise-activate-hero.tsx -msgid "Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance." -msgstr "" - -#. js-lingui-id: krHgj1 -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Your enterprise key" -msgstr "" - -#. js-lingui-id: +dxjCu -#: src/sections/enterprise-activate/enterprise-activate-client.tsx -msgid "Your enterprise license has been activated successfully." -msgstr "" - -#. js-lingui-id: pEQiCY -#: src/partner-application/partner-application-copy.ts -msgid "Your name *" -msgstr "" - -#. js-lingui-id: fQATWn -#: src/sections/product-feature/feature-tiles.ts -msgid "Your network, fully mapped." -msgstr "" - -#. js-lingui-id: sgod9b -#: src/platform/releases/release-notes.tsx -msgid "Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code." -msgstr "" - -#. js-lingui-id: CgGN5T -#: src/partner-application/data/partner-country-options.ts -msgid "Zambia 🇿🇲" -msgstr "" - -#. js-lingui-id: wHjFOw -#: src/case-studies/case-study-catalog.ts -msgid "Zero" -msgstr "" - -#. js-lingui-id: ZvEoMq -#: src/case-studies/case-study-stories.ts -msgid "Zero manual work at the core. Full automation. Built on Twenty." -msgstr "" - -#. js-lingui-id: TT3YXb -#: src/partner-application/data/partner-country-options.ts -msgid "Zimbabwe 🇿🇼" -msgstr "" - -#. js-lingui-id: ACjxWW -#: src/app-preview/stage/traffic-lights.tsx -msgid "Zoom" -msgstr "" diff --git a/packages/twenty-website-redone/src/locales/generated/en.ts b/packages/twenty-website-redone/src/locales/generated/en.ts deleted file mode 100644 index 25db36ea49..0000000000 --- a/packages/twenty-website-redone/src/locales/generated/en.ts +++ /dev/null @@ -1 +0,0 @@ -/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"BUIzFF\":[\"-33% off\"],\"AGZHx4\":[\"...with AI that actually helps you *work faster*\"],\"Z6mKXu\":[[\"0\"],\" — Twenty Partner\"],\"sGt3Jm\":[[\"0\"],\" case study\"],\"jC5JCB\":[[\"count\"],\" Case Studies\"],\"NSO/FI\":[[\"hourly\"],\"/hr\"],\"rAP+km\":[[\"labelText\"],\" filter\"],\"7hlEpj\":[[\"labelText\"],\" filter, \",[\"0\"],\" selected\"],\"0Qb9by\":[\"*150 hours* saved every month\"],\"k3IzYC\":[\"*Zero manual work* at the core\"],\"icND7o\":[\"/ seat / month - billed yearly\"],\"XUqxHW\":[\"/user/month\"],\"UEDohT\":[\"© \",[\"year\"],\" – Twenty\"],\"2ygf/L\":[\"← Back\"],\"9j/bUt\":[\"← Twenty partners\"],\"foGG8A\":[\"+$105/user per month\"],\"Bsq9GJ\":[\"+$35/user per month\"],\"mWSpW5\":[\"+$5/user per month\"],\"JIwDAd\":[\"+$7000/org per month\"],\"yVr18d\":[\"+$75/user per month\\nSwitch to enterprise!\"],\"iK+ikF\":[\"+10k others\"],\"nRtVCK\":[\"+20% of net spend\\n+$75/user per month\\nSwitch to enterprise!\"],\"BmAWVq\":[\"<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management.\"],\"pQcyVv\":[\"<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\\\"No Value\\\" Column: Cards that are not assigned to a specific value will now appear in a \\\"No Value\\\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked.\"],\"cCqojY\":[\"<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access.\"],\"be30i9\":[\"$0\"],\"6inRXo\":[\"$1/orchestration run/org\\n+$75/user per month\\nSwitch to enterprise!\"],\"EkIZkY\":[\"$19\"],\"8r6DgO\":[\"$9\"],\"EHNAf2\":[\"1 click\"],\"qvNspm\":[\"1‑800‑YES‑SOFTWARE\"],\"6WQdu8\":[\"100 per minute\"],\"uuKUqZ\":[\"11 permissions\\ngroups\"],\"2szX5S\":[\"150\"],\"9ntyY8\":[\"150 hrs\"],\"2z1Znr\":[\"2 years contract\"],\"l6Vx4q\":[\"2,000+\"],\"FKcV/y\":[\"2025\"],\"PJgfBS\":[\"3\"],\"BL47wE\":[\"3 2 years contract\\n-33% off\"],\"/jgC+9\":[\"3 product lines\"],\"7SJhyh\":[\"30+\"],\"Pdl2UE\":[\"4 tools\"],\"2ScEtE\":[\"5 workflow credits/month included\"],\"hIKxCy\":[\"5,000\"],\"Z2TH0F\":[\"50 per minute\"],\"CiRGZ8\":[\"50 workflow credits/year included\"],\"tZvajW\":[\"6 workflows\"],\"fHxYPM\":[\"90%+\"],\"u6Xxdi\":[\"A business that does not fit a *template*\"],\"NLSM5L\":[\"A business that does not fit a template\"],\"SR9TmK\":[\"A CRM for teams that *move fast*\"],\"MXRINg\":[\"A CRM that\\n*grows* with you\"],\"diWAWP\":[\"A CRM that grows with you\"],\"och6cp\":[\"A CRM that grows with you | NetZero & Twenty\"],\"N3qsQD\":[\"A CRM they\\n*actually own*\"],\"muZzEA\":[\"A CRM they actually own\"],\"HSyZ9R\":[\"A custom CRM gives your org an edge, *but building one* comes with *tradeoffs*\"],\"Ll7vsZ\":[\"A demo worth a *thousand words*\"],\"uNIo/j\":[\"A modern CRM with *an intuitive interface*\"],\"sDJ4rX\":[\"A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views.\"],\"aYUQpm\":[\"A new maintenance mode helps admins pause workspace changes during sensitive operations.\"],\"P5BDuh\":[\"A platform ready to *grow*\"],\"rxMguZ\":[\"A platform ready to grow\"],\"vbJW8I\":[\"A real estate agency on WhatsApp built a\\n*CRM* around it\"],\"hwoGni\":[\"A real estate agency on WhatsApp built a CRM around it\"],\"WjUlJr\":[\"A retro theme as a paid add-on is somehow the most believable part.\"],\"r9Msiv\":[\"A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \\\"I want this\\\" and \\\"it's live\\\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption.\"],\"H1lDvm\":[\"Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update.\"],\"c0RR2h\":[\"About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together.\"],\"41o3VS\":[\"AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control.\"],\"TuJiQF\":[\"AC&T Education Migration\"],\"yHUdh6\":[\"AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export.\"],\"MPzy5R\":[\"AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%.\"],\"J+A83M\":[\"AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%.\"],\"Kqfsda\":[\"Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance.\"],\"muhZ+X\":[\"Activating your enterprise license…\"],\"+cggij\":[\"Activation failed. Please try again.\"],\"trCWSt\":[\"Activation response was incomplete.\"],\"Yyn/dP\":[\"Active filters\"],\"iNSn2+\":[\"Add files directly to records so documents, screenshots, and other assets stay attached to the right work.\"],\"x0pZJy\":[\"Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define.\"],\"woOp+c\":[\"Add objects and fields\"],\"ZuoQMi\":[\"Add records to filtered views\"],\"l3+wiC\":[\"Add rich text directly inside layouts with the new dedicated field widget.\"],\"ced+/c\":[\"Add Several emails for one contact\"],\"Y2K3rp\":[\"Add-ons\"],\"U4glZw\":[\"Added \\\"Group By\\\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu.\"],\"6u4D5m\":[\"Address Field Type\"],\"g1in8j\":[\"Admin Panel\"],\"Op7nVF\":[\"Adoption\"],\"SUk0w7\":[\"Advanced Email and Calendar Settings\"],\"dePx/O\":[\"Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction.\"],\"c0acMS\":[\"Advanced filters\"],\"JiIKww\":[\"Advanced Settings\"],\"2050Pj\":[\"Advisory & Discovery\"],\"QjSFuI\":[\"Afghanistan 🇦🇫\"],\"StqEz0\":[\"Africa\"],\"NmHsVh\":[\"Agency\"],\"vZKKhf\":[\"Aggregate, bar, line, and pie widgets\"],\"HURF9k\":[\"Aggregates\"],\"rp2omj\":[\"Agribusiness\"],\"jiGK6+\":[\"AI (Einstein)\"],\"aUn7Ps\":[\"AI & Automations\"],\"HbXHSp\":[\"AI agents\"],\"WGXwzu\":[\"AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain.\"],\"Rsxdfy\":[\"AI Agents with custom skills\"],\"JHi+LN\":[\"AI agents, chats, and MCP\"],\"n2fhCy\":[\"AI chat\"],\"YeA2Ox\":[\"AI Chat is easier to use with a cleaner experience and clearer model choices.\"],\"TfV/y9\":[\"AI chat, settings, and records in a side panels for fast, single-screen access.\"],\"R+bwFB\":[\"AI for rapid iterations\"],\"svfUwH\":[\"AI in the *migration workflow*\"],\"A6v5aI\":[\"AI in the migration workflow\"],\"t97j+F\":[\"AI-assisted\"],\"7xlBwk\":[\"Albania 🇦🇱\"],\"EszGq4\":[\"Algeria 🇩🇿\"],\"LIGwFL\":[\"Alternative Partners\"],\"GDVvyT\":[\"Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers.\"],\"CCrRuT\":[\"Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work.\"],\"UIu18Y\":[\"Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee.\"],\"+BHPrF\":[\"always\"],\"iFLhqi\":[\"Amrendra Pratap Singh\"],\"Sbiivs\":[\"Andorra 🇦🇩\"],\"Uv5eaJ\":[\"Angola 🇦🇴\"],\"qKANz3\":[\"Antigua & Barbuda 🇦🇬\"],\"BfeCSx\":[\"Any Field filter\"],\"aGCcXe\":[\"Any Questions?\"],\"lgSvgF\":[\"Anything else we should know?\"],\"pkMjbA\":[\"Anything that needs a developer.\"],\"dYZUP3\":[\"Anything that needs devops skills.\"],\"AfiWqP\":[\"APAC\"],\"/AMVjF\":[\"APEX tutorials\"],\"yKBF3l\":[\"API access\"],\"30KnZB\":[\"API calls\"],\"42FQ3y\":[\"API-first\"],\"azQMHP\":[\"APIs are extra. Simplicity has a price.\"],\"MqJvvH\":[\"APIs, SDKs and webhooks to extend Twenty and ship apps on top of your CRM data.\"],\"k8I7/G\":[\"Apply to build\\n*the future of CRM*\"],\"LJCDxT\":[\"Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM.\"],\"8HV3WN\":[\"Arabic\"],\"uicv6Z\":[\"Architecture\"],\"fT9xVz\":[\"Argentina 🇦🇷\"],\"3KxGep\":[\"Armenia 🇦🇲\"],\"S+Q+1d\":[\"Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams.\"],\"7UGCGX\":[\"Assemble, iterate and adapt a robust CRM, *that's quick to flex*\"],\"v7zTZl\":[\"Assign owners and due dates\"],\"awzjg/\":[\"Attachment Visualizer\"],\"fxL/Km\":[\"Attachments without the chaos.\"],\"y2W2Hg\":[\"Audit logs\"],\"tw0/s1\":[\"Australia 🇦🇺\"],\"4cf5s+\":[\"Austria 🇦🇹\"],\"FFv0Vh\":[\"Automation\"],\"SJ7WSP\":[\"Available on YouTube!\"],\"8d+jRc\":[\"Azerbaijan 🇦🇿\"],\"iH8pgl\":[\"Back\"],\"wIoAQo\":[\"Bahamas 🇧🇸\"],\"Rhju1T\":[\"Bahrain 🇧🇭\"],\"LxzgmZ\":[\"Bangladesh 🇧🇩\"],\"rtcPS0\":[\"Barbados 🇧🇧\"],\"RownlY\":[\"Based in\"],\"jQLfIW\":[\"Because apparently privacy feels more premium with a surcharge.\"],\"qEQv1F\":[\"Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform.\"],\"uIG0OH\":[\"Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites.\"],\"JGM+JO\":[\"Because true orchestration means putting a dollar sign on every dramatic entrance.\"],\"Z7U/Og\":[\"Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected.\"],\"kWm0dC\":[\"Become\\n*our partner*\"],\"PKMHNe\":[\"become a genius!\"],\"6ZCRfT\":[\"Become a partner\"],\"j+1dcz\":[\"Become a Twenty Partner — Apply\"],\"83Wi6G\":[\"Begin with production-grade *building blocks*\"],\"0TCnEf\":[\"Belarus 🇧🇾\"],\"qblg4t\":[\"Belgium 🇧🇪\"],\"pSF7xM\":[\"Belize 🇧🇿\"],\"Hds3Bq\":[\"Bengali\"],\"cTWkw3\":[\"Benin 🇧🇯\"],\"SYfuGP\":[\"Benjamin Reynolds\"],\"YfjrMq\":[\"Bertrams\"],\"mzTjnf\":[\"Better than Liquid Glass!\"],\"T1oJwH\":[\"Beyond *internal rollout*\"],\"OPnz/X\":[\"Bhutan 🇧🇹\"],\"8tzR0k\":[\"Billing period\"],\"BpyJwa\":[\"Blue developer illustration with branching arrows\"],\"TVJDFA\":[\"Bolivia 🇧🇴\"],\"MkvsWx\":[\"Book a call\"],\"Wzdd8u\":[\"Bosnia & Herzegovina 🇧🇦\"],\"wtNsrt\":[\"Botswana 🇧🇼\"],\"yCaNfF\":[\"Brazil 🇧🇷\"],\"bmk2dj\":[\"Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models.\"],\"VX4eI/\":[\"Brunei 🇧🇳\"],\"s4FVHa\":[\"Build a CRM your\\ncompetitors *can't buy.*\"],\"sbr0X/\":[\"Build a dashboard of pipeline by stage\"],\"uetyzD\":[\"Build a pipeline board grouped by stage\"],\"3+uH0v\":[\"Build an app\"],\"Utc5RF\":[\"Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads.\"],\"rdvFK9\":[\"Build it in an afternoon. *AI made the gap that small.*\"],\"e1u+Zh\":[\"Build on an open platform\"],\"yEKs3h\":[\"Build with your favorite tools\"],\"2FDUkV\":[\"Build your Enterprise CRM *at AI Speed*\"],\"SoAKmY\":[\"Built for speed\"],\"sdItv6\":[\"Bulgaria 🇧🇬\"],\"Lze0QH\":[\"Bulk Deletion\"],\"dNnRlc\":[\"Burkina Faso 🇧🇫\"],\"j8RGrG\":[\"Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty\"],\"jtdtLa\":[\"Burundi 🇧🇮\"],\"L40Ae7\":[\"Calendar / booking link\"],\"6DqzR/\":[\"Calendar View for Objects\"],\"4yFkf9\":[\"Cambodia 🇰🇭\"],\"AvRzYu\":[\"Cameroon 🇨🇲\"],\"wCALve\":[\"Can developers extend Twenty with code?\"],\"6mytgb\":[\"Can I migrate from Salesforce or HubSpot?\"],\"nEOTNi\":[\"Canada 🇨🇦\"],\"hRO6uK\":[\"Cape Verde 🇨🇻\"],\"qLBo3s\":[\"carousel\"],\"C6wh0T\":[\"Case\"],\"M1RLfx\":[\"Catalan\"],\"NUrY9o\":[\"Categories\"],\"dBApoS\":[\"Central African Republic 🇨🇫\"],\"iI3Dq9\":[\"Chad 🇹🇩\"],\"+DEogc\":[\"Change language\"],\"2D9CbR\":[\"Check more add-ons\"],\"2BY3So\":[\"Chile 🇨🇱\"],\"zG6t8U\":[\"China 🇨🇳\"],\"h1IXFK\":[\"Chinese\"],\"s2oWpP\":[\"Choose a language\"],\"AZNxzv\":[\"Choose a role directly when inviting a teammate to a workspace.\"],\"geiXTM\":[\"Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need.\"],\"TNVfAe\":[\"Choose how to display dates in any field using a universal Unicode date format that best suits your use case.\"],\"3wV73y\":[\"City\"],\"ZbCD7v\":[\"Classic never dies. It just gets extended one more time.\"],\"u8JHrO\":[\"Clear filters\"],\"yz7wBu\":[\"Close\"],\"cu6iol\":[\"Close dialog\"],\"vcpc5o\":[\"Close menu\"],\"oLsrmd\":[\"Close pricing window\"],\"R7zx6E\":[\"cloud\"],\"L/LPQZ\":[\"Cloud Pro is $9/user/month (yearly). Organization is $19/user/month and unlocks SSO and row-level permissions for teams that need finer access control.\"],\"WYgF8M\":[\"Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions.\"],\"1YncLF\":[\"Co-founder at NetZero\"],\"4QGkvo\":[\"co-founder of NetZero\"],\"vWaYWP\":[\"Co-founder, NetZero\"],\"dcLsG5\":[\"Colombia 🇨🇴\"],\"b5bnuN\":[\"Column-to-field mapping (including relations)\"],\"ofoEsM\":[\"Coming soon!\"],\"KGD9Kt\":[\"Commercial license (no AGPL obligations)\"],\"OnPROL\":[\"Commercials\"],\"chL5IG\":[\"Community\"],\"8CLnho\":[\"Community support\"],\"RxpseA\":[\"Comoros 🇰🇲\"],\"SHjhDC\":[\"Company or brand *\"],\"Fkb+LW\":[\"Compose your CRM and internal apps with a single extensibility toolkit.\"],\"kD7ZGH\":[\"Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation.\"],\"2DQw7/\":[\"Congo 🇨🇬\"],\"iSLIjg\":[\"Connect\"],\"90KBr0\":[\"Connect Google or Microsoft accounts\"],\"xgrBCK\":[\"Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically.\"],\"dGwMkb\":[\"Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team.\"],\"MVrQxI\":[\"Connected via API\"],\"cfAG43\":[\"Consulting\"],\"GsUBlG\":[\"Contact \",[\"partnerName\"]],\"Oii3vg\":[\"Contacts & Companies\"],\"24qVhV\":[\"Context lives with the record.\"],\"mXovG/\":[\"Continue iteration *without friction*\"],\"LqyWsJ\":[\"Contributors now have their very own hall of fame.\"],\"qVH+kL\":[\"Contributors page\"],\"+Uepfb\":[\"Control\"],\"GplbCP\":[\"Control without *the overhead*\"],\"wH1xmY\":[\"Control without drag\"],\"Bj7igG\":[\"Control without the overhead\"],\"PiH3UR\":[\"Copied!\"],\"he3ygx\":[\"Copy\"],\"7qTWwB\":[\"Copy the enterprise key above.\"],\"PXnj76\":[\"Copy this key and paste it into your Twenty self-hosted instance settings.\"],\"FapWIq\":[\"Core Features\"],\"Al/blj\":[\"Costa Rica 🇨🇷\"],\"1B8JTc\":[\"Costs down more than *90%*\"],\"cRA2/z\":[\"Country *\"],\"kCu+Rq\":[\"Create a Kanban view on any object and streamline processes like recruitment or onboarding.\"],\"Xn2Nlq\":[\"Create a workflow\"],\"+kFrvb\":[\"Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs.\"],\"t9znrt\":[\"Create and organize sidebar items more easily with a cleaner navigation setup.\"],\"B9nLrl\":[\"Create apps on Twenty\"],\"yAL7FY\":[\"Create custom apps\"],\"20ZdFp\":[\"Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics.\"],\"YxktRb\":[\"Create fields and edit field widgets more directly from record pages.\"],\"RRfcjH\":[\"Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities.\"],\"qCRCtk\":[\"Create more flexible relationships between objects, including more advanced many-to-many setups.\"],\"oS1RiS\":[\"Create tasks from records\"],\"D3S5+x\":[\"Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context.\"],\"egTba/\":[\"Created By\"],\"ppNnWO\":[\"Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields.\"],\"NLgmM4\":[\"CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection\"],\"Y44Xsf\":[\"CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again.\"],\"wDasLa\":[\"CRM Engineer\"],\"DqkzNV\":[\"CRM Engineer, AC&T Education Migration\"],\"b7vNti\":[\"CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy.\"],\"ntHvtU\":[\"CRM was a ledger. *AI turned it into an operating system.*\"],\"OACAVp\":[\"Croatia 🇭🇷\"],\"I6FFSA\":[\"CSV export anytime\"],\"8RWevB\":[\"CSV import & export\"],\"s+QiQi\":[\"CSV import flow\"],\"zyTj4q\":[\"CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports.\"],\"O2UtEV\":[\"Cuba 🇨🇺\"],\"auudI+\":[\"Currency Field\"],\"lh6aPn\":[\"Custom AI models\"],\"OaTurC\":[\"Custom apps\"],\"TcUCTv\":[\"Custom Apps · Scripts · AI/agent integrations\"],\"onPW5H\":[\"Custom date formats\"],\"yBSEtR\":[\"Custom deal stages for your process\"],\"L+b7SB\":[\"Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality.\"],\"DUnke3\":[\"Custom Development\"],\"GAD3Dx\":[\"Custom domain\"],\"Vz1Vq2\":[\"Custom domain (crm.yourco.com)\"],\"oPwQt4\":[\"Custom fields\"],\"U1RB/7\":[\"Custom fields and relationships\"],\"WGKb6T\":[\"Custom fields, relationships, and a unified timeline for every contact and company in your workspace.\"],\"prIqWa\":[\"Custom layout\"],\"RuYs9T\":[\"Custom layouts\"],\"8skTDV\":[\"Custom objects\"],\"y5pLQH\":[\"Custom sidebar\"],\"AbyZbl\":[\"Custom views\"],\"5xK1jE\":[\"Customer stories\"],\"YjXLAQ\":[\"Customer Stories\"],\"BavWCk\":[\"Customer stories preview\"],\"0fgCyk\":[\"Customer story\"],\"zKLqOg\":[\"Customer story not found — Twenty\"],\"NihQNk\":[\"Customers\"],\"qqLY+j\":[\"Customization\"],\"GRfLAg\":[\"Customizations\"],\"dy0yuR\":[\"Customize your sub-domain\"],\"Pj5fGG\":[\"Cyprus 🇨🇾\"],\"w9VTXG\":[\"Czech\"],\"xkuHM6\":[\"Czech Republic 🇨🇿\"],\"4RLD4p\":[\"Daily messages\"],\"Fo2vDn\":[\"Danish\"],\"aebTao\":[\"Dashboards in Labs (Beta)\"],\"V0kvgB\":[\"Data import\"],\"5cNMFz\":[\"Data model\"],\"ZEsvS2\":[\"Data Model Diagram\"],\"iq2WTm\":[\"Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations\"],\"dSuMNg\":[\"Datetime Field\"],\"/TlpVf\":[\"Deals that move themselves.\"],\"H1UtjM\":[\"Denmark 🇩🇰\"],\"tqbpyT\":[\"Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting.\"],\"X5B6sd\":[\"Dev teams power company-wide *change with Twenty*\"],\"n+SX4g\":[\"Developers\"],\"5atXgh\":[\"Developers can now take advantage of the new array field type to store non-predefined values.\"],\"canH5K\":[\"Developers can now use webhooks to synchronize customer data updates in real-time across applications.\"],\"ohFj56\":[\"Differentiation now *lives in the code you own.*\"],\"Wuqvfz\":[\"Director of Digital and Information, Elevate Consulting\"],\"gW1L7t\":[\"Director, W3villa Technologies, Partner\"],\"30qcNY\":[\"Discord (opens in new tab)\"],\"old0Lj\":[\"Discover the newest features and improvements in Twenty, the #1 Open Source CRM.\"],\"W+b/DF\":[\"Discover what's new\"],\"rHLwDO\":[\"Djibouti 🇩🇯\"],\"Zjjbne\":[\"Do I need a developer to customize Twenty?\"],\"Zx22Ih\":[\"Does Twenty work with Claude, ChatGPT, and Cursor?\"],\"bMDnQR\":[\"Dominica 🇩🇲\"],\"ufcRA6\":[\"Dominican Republic 🇩🇴\"],\"pOLPPB\":[\"Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling.\"],\"HDR0en\":[\"DR Congo 🇨🇩\"],\"mzedFr\":[\"Draft a workflow for an email sequence\"],\"q7M3jo\":[\"Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works.\"],\"fPma12\":[\"Drag-and-drop deals between stages\"],\"KIjvtr\":[\"Dutch\"],\"6r6pDf\":[\"e.g. React, Postgres, n8n…\"],\"a35sCN\":[\"Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain.\"],\"s+5p5k\":[\"Easier field editing\"],\"nKXMzJ\":[\"Easier layouts\"],\"hEtClO\":[\"Ecuador 🇪🇨\"],\"4CJ4xV\":[\"EdTech\"],\"aqxYLv\":[\"Education\"],\"OAdXUT\":[\"Egypt 🇪🇬\"],\"2xK+An\":[\"El Salvador 🇸🇻\"],\"1wTjWx\":[\"Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth.\"],\"2THY70\":[\"Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data.\"],\"wiTeYI\":[\"Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs.\"],\"FNyrb0\":[\"Email & Calendar\"],\"jTgK6B\":[\"Email and calendar Blocklist\"],\"AoN898\":[\"Email and Chat\"],\"rc8HEz\":[\"Email replies\"],\"ObCvfI\":[\"Email sharing\"],\"7o9obN\":[\"Email thread widgets and an inline reply composer make it easier to work directly from messaging records.\"],\"hfqiVr\":[\"Email/calendar activity on each record\"],\"XGd8Wo\":[\"Emails & Calendar\"],\"o4/9l1\":[\"Emails and events linked to CRM records\"],\"QOINDn\":[\"empty\"],\"ZxDrUL\":[\"Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!\"],\"jkaFcU\":[\"Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in.\"],\"Qpn/bX\":[\"Encrypt your data\"],\"Iy8Gze\":[\"Encryption key rotation\"],\"lYGfRP\":[\"English\"],\"pNNVhg\":[\"Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication.\"],\"kZ17+i\":[\"Enhance your data handling capabilities with the addition of four new field types:\"],\"CVqFAV\":[\"Enhanced Kanban Board\"],\"LKTMHa\":[\"Enhanced One-to-Many Relations Editing\"],\"ovz6sZ\":[\"Enhanced Timeline\"],\"Ijh+h+\":[\"Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins.\"],\"xoqD/n\":[\"Enter a valid email address.\"],\"/OVUD6\":[\"Enter a valid URL (starting with http:// or https://).\"],\"87BcPj\":[\"Enterprise *activation*\"],\"NTskGY\":[\"Enterprise Activation | Twenty\"],\"3dQ6zJ\":[\"Environments\"],\"c0nqfC\":[\"Equatorial Guinea 🇬🇶\"],\"4DIpFY\":[\"Eritrea 🇪🇷\"],\"JIhNLR\":[\"Estonia 🇪🇪\"],\"8yXuJ9\":[\"Eswatini 🇸🇿\"],\"rktGGp\":[\"Ethiopia 🇪🇹\"],\"rQqP1P\":[\"Europe\"],\"IhKZhp\":[\"Even the training material is a feature worth celebrating.\"],\"sQP1sF\":[\"Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most.\"],\"rkZTD7\":[\"Every thread, on the right record.\"],\"kz/8m8\":[\"Everything in Pro\"],\"zoNk7e\":[\"Everything updates in real time, with AI chat always ready to help you move faster.\"],\"/g9UKY\":[\"Everything you need, *out of the box*\"],\"2NGXKo\":[\"Expanded support for 30+ languages, so users can navigate and use the software in their preferred language.\"],\"14xdUh\":[\"Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization.\"],\"57gG1f\":[\"Experience enterprise-grade granularity, starting with an 11th permission.\"],\"uZRQi+\":[\"Expertise & experience\"],\"JTM5zS\":[\"Explore customer stories\"],\"weFouS\":[\"Extended run!\"],\"tX4pRm\":[\"Failed to activate enterprise key. Please try again.\"],\"akLvep\":[\"Familiar, modern interface\"],\"gKNP7S\":[\"Farsi\"],\"abO45l\":[\"Fast path to action\"],\"idFRAo\":[\"Faster field setup\"],\"3qy0z4\":[\"Favorites now live in the navigation menu, making the sidebar easier to organize and customize.\"],\"JrTb6F\":[\"Favorites Views and Favorites Folders\"],\"+LREeu\":[\"feature\"],\"hXRm6J\":[\"Field Level Permission\"],\"3Y3//3\":[\"Field widgets\"],\"QDxnW/\":[\"Field widgets are easier to configure directly from the page where you use them.\"],\"5SV9rS\":[\"Field widgets now support more relation types, so custom layouts work better across more objects.\"],\"e6BgMV\":[\"Field-level permissions\"],\"z+q1Th\":[\"Fiji 🇫🇯\"],\"sER+bs\":[\"Files\"],\"jxbpA9\":[\"Files in records\"],\"1t0xRH\":[\"Filter by Multi-Select\"],\"bOidm7\":[\"Filter partners\"],\"kUUNrw\":[\"Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company.\"],\"iabLgo\":[\"Filtered metrics from any object\"],\"sRUAXp\":[\"Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us.\"],\"TJ7HQl\":[\"Find a partner\"],\"MD032e\":[\"Find a Twenty partner\"],\"S6CEQ9\":[\"Find a Twenty Partner — Open Source CRM Marketplace\"],\"wHyJkT\":[\"Find the right partner to implement, customize, and tailor Twenty to your team.\"],\"5asqas\":[\"Find your *Twenty partner*\"],\"9V48qi\":[\"Finland 🇫🇮\"],\"USZ2N6\":[\"Finnish\"],\"PHM5wp\":[\"Flexibility\"],\"YsFkku\":[\"Flexible relations\"],\"HBJ0P5\":[\"Flow\\norchestration\"],\"obrJBN\":[\"Fly through your workspace with shortcuts and short load times.\"],\"HjFq2b\":[\"Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute.\"],\"mjIRMF\":[\"Focus on the use case, not the *plumbing*\"],\"P5E+kT\":[\"Focus on the use case, not the plumbing\"],\"wdVyxi\":[\"Folder/Label import\"],\"qwJuVW\":[\"Footer\"],\"CKQ0za\":[\"For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation.\"],\"yAJC9c\":[\"For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it.\"],\"UCoxP5\":[\"Founder, Nine Dots Ventures\"],\"IPaRlc\":[\"Founder, Wintactix\"],\"671GY5\":[\"France 🇫🇷\"],\"tUgSXd\":[\"Free for you!\"],\"nLC6tu\":[\"French\"],\"weRlb1\":[\"from \",[\"minBudget\"]],\"Iuxc00\":[\"From CSV to CRM in minutes.\"],\"Mxpask\":[\"From documents to *open APIs*\"],\"emeKZ7\":[\"From documents to open APIs\"],\"2CtZ6T\":[\"From Salesforce to\\n*self-hosted Twenty*\"],\"kl+hEJ\":[\"From Salesforce to self-hosted Twenty\"],\"syU/BD\":[\"From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners\"],\"UfoVki\":[\"From simple to *advanced*\"],\"Lf7cb3\":[\"From simple to advanced\"],\"m1I5TY\":[\"Full communication history in one place\"],\"wXgKOm\":[\"Full customization\"],\"YZ7Q3Z\":[\"Full ownership\"],\"hdxwWi\":[\"Fully customizable\"],\"//hrfs\":[\"Gabon 🇬🇦\"],\"yau9J6\":[\"Gambia 🇬🇲\"],\"S84RWl\":[\"Generate tasks for my top 10 accounts\"],\"GOmD9p\":[\"Georgia 🇬🇪\"],\"DDcvSo\":[\"German\"],\"XcPIuI\":[\"Germany 🇩🇪\"],\"ZDIydz\":[\"Get started\"],\"xyKSqi\":[\"Ghana 🇬🇭\"],\"3QRTgQ\":[\"GitHub (opens in new tab)\"],\"wuH0g5\":[\"Gmail integration\"],\"n8waaJ\":[\"Go the extra mile *with no-code*\"],\"Ay/vbT\":[\"Good choice!\"],\"opD7oA\":[\"Google Calendar Integration\"],\"Zh0acB\":[\"Grab 30 minutes so we can get to know your team.\"],\"1W3PAd\":[\"Granular Email Folder Sync\"],\"+tDN2S\":[\"Greece 🇬🇷\"],\"CZXzs4\":[\"Greek\"],\"DDgHcm\":[\"Grenada 🇬🇩\"],\"MCLWq4\":[\"Grow with a flexible foundation\"],\"M/8CC1\":[\"Guatemala 🇬🇹\"],\"UZbq7J\":[\"Guinea 🇬🇳\"],\"vtpxPx\":[\"Guinea-Bissau 🇬🇼\"],\"GT8Ua2\":[\"Guyana 🇬🇾\"],\"5BLiJj\":[\"Haiti 🇭🇹\"],\"Xf5EJg\":[\"Halftone generator\"],\"DHC85F\":[\"Halftone Generator | Twenty\"],\"c3XJ18\":[\"Help\"],\"CRzGla\":[\"Help center\"],\"LiWOgh\":[\"Hey, I'm interested in meeting. Here's my project:\"],\"EhWatX\":[\"Hide changes\"],\"tGjibo\":[\"Hindi\"],\"qfSbUb\":[\"His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix.\"],\"i0qMbr\":[\"Home\"],\"CtU7yU\":[\"Homeseller\"],\"KYnPnU\":[\"Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together.\"],\"v6cmMq\":[\"Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time.\"],\"xaIV9m\":[\"Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty\"],\"zbfmqm\":[\"Honduras 🇭🇳\"],\"mqX9AX\":[\"Hosting & Infrastructure\"],\"SHZNBm\":[\"Hourly\"],\"Ivq5+7\":[\"Hourly rate\"],\"XnFo3G\":[\"How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership.\"],\"PYi0f6\":[\"How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership.\"],\"+MLOVo\":[\"How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack.\"],\"OIwpKt\":[\"How long does it take to get started?\"],\"iRzy9e\":[\"How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows.\"],\"NZYA4S\":[\"How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day.\"],\"5sWcC0\":[\"How teams\\n*built with Twenty*\"],\"Z3Cabh\":[\"How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy.\"],\"URQPvK\":[\"How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone.\"],\"htrFcw\":[\"Hungary 🇭🇺\"],\"T6wyby\":[\"I'll book later →\"],\"RYDa0v\":[\"Iceland 🇮🇸\"],\"ePYQjq\":[\"Identity\"],\"Grur3I\":[\"IMAP\"],\"l0JGUk\":[\"Impersonate users\"],\"N4OVNn\":[\"Implementation\"],\"yHueLx\":[\"Implementation partners\"],\"9P1c4k\":[\"Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched.\"],\"WxaeWx\":[\"Import Relations\"],\"BHNxPe\":[\"Import V2\"],\"ZAKTS6\":[\"Import your data with field mapping, including relations. Export anytime — your data is always yours.\"],\"cCwGqi\":[\"Improved Onboarding Experience\"],\"86Q2Qb\":[\"Improved Performance\"],\"InyU0Z\":[\"In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect.\"],\"d1Aru8\":[\"In production.\"],\"Sqb+jp\":[\"In-app preview for supported file types (when enabled)\"],\"3XP8Lk\":[\"Included!\"],\"/c4yUr\":[\"India 🇮🇳\"],\"iEJqDi\":[\"Indonesia 🇮🇩\"],\"BQukYF\":[\"Indonesian\"],\"S8gy7K\":[\"Industry\"],\"MeL8SS\":[\"Infinite scroll\"],\"+mOisw\":[\"Infinite scroll is still coming soon, unlike the invoice.\"],\"K8iwJx\":[\"Install shared tarball app\"],\"AHWM9N\":[\"Integration\"],\"OChKCc\":[\"Interactive halftone generator exported from Twenty.\"],\"+83cJG\":[\"Interested in meeting \",[\"partnerName\"]],\"MAqMna\":[\"Internal Email Privacy\"],\"0ysJ3C\":[\"Internal team emails won't sync, protecting privacy by preventing access to internal discussions.\"],\"a+PGuG\":[\"Internet accounts per user\"],\"87rKhU\":[\"Introduced a \\\"Data Model Diagram\\\" feature that allows users to visualize the relationships between different objects within the CRM.\"],\"vJncsm\":[\"Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis.\"],\"TR1ici\":[\"Introduced a new design for notifications featuring lighter colors.\"],\"5G37wD\":[\"Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today.\"],\"5BnBV4\":[\"Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!\"],\"KBwqIW\":[\"Invite roles\"],\"FtgjCv\":[\"Iran 🇮🇷\"],\"8yynyz\":[\"Iraq 🇮🇶\"],\"s7XmoY\":[\"Ireland 🇮🇪\"],\"/yQIKP\":[\"Is Twenty really open-source?\"],\"SdtpDP\":[\"Israel 🇮🇱\"],\"QjEULz\":[\"It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other.\"],\"FJ51pP\":[\"It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not.\"],\"kqIAbN\":[\"It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck.\"],\"ltNDOB\":[\"It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden.\"],\"Lj7sBL\":[\"Italian\"],\"OSTD8d\":[\"Italy 🇮🇹\"],\"0BTIQi\":[\"Ivory Coast 🇨🇮\"],\"W6o2Pv\":[\"Jamaica 🇯🇲\"],\"kpk6mj\":[\"Japan 🇯🇵\"],\"dFtidv\":[\"Japanese\"],\"Lsf2+K\":[\"Join our ecosystem and help businesses take control of their customer data with open-source primitives.\"],\"1qiriB\":[\"Join our growing partner ecosystem\"],\"VQIurp\":[\"Join our partner ecosystem and help businesses take control of their CRM.\"],\"m/pXki\":[\"Join the teams that chose to own their CRM. Start building with Twenty today.\"],\"QbxNys\":[\"Jordan 🇯🇴\"],\"VnZMnC\":[\"JSON Field\"],\"pB76mP\":[\"Jul 2025\"],\"hvwlu3\":[\"Jun 2025\"],\"qrYDGE\":[\"Justin Beadle\"],\"vYXuJI\":[\"Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions.\"],\"E6Oohx\":[\"Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it.\"],\"3LDjR0\":[\"Kanbans on any object\"],\"r1cFAW\":[\"Kazakhstan 🇰🇿\"],\"kEahsE\":[\"Kenya 🇰🇪\"],\"TLanjj\":[\"kept\"],\"IxBSi8\":[\"Kiribati 🇰🇮\"],\"h6S9Yz\":[\"Korean\"],\"PqhUrP\":[\"Kosovo 🇽🇰\"],\"3+TwF3\":[\"Kuwait 🇰🇼\"],\"e9zZkH\":[\"Kyrgyzstan 🇰🇬\"],\"8QgJZb\":[\"Labs\"],\"GAmD3h\":[\"Languages\"],\"u6jooT\":[\"Languages spoken\"],\"YHacTY\":[\"Laos 🇱🇦\"],\"2lrGbG\":[\"LATAM\"],\"WvrtRi\":[\"Latest\\n*Releases*\"],\"7OHfcc\":[\"Latvia 🇱🇻\"],\"rdU729\":[\"Layout\"],\"+Ss/og\":[\"Learn how to use Twenty\"],\"wB0DGn\":[\"Lebanon 🇱🇧\"],\"vifyyw\":[\"Legal\"],\"UqdHpG\":[\"Lesotho 🇱🇸\"],\"rJargy\":[\"Liberia 🇱🇷\"],\"Lzw0kM\":[\"Libya 🇱🇾\"],\"tHFTlp\":[\"Licensee:\"],\"K41WYc\":[\"Liechtenstein 🇱🇮\"],\"ESTOTK\":[\"Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content.\"],\"kvxPie\":[\"Link field\"],\"gggTBm\":[\"LinkedIn\"],\"3hSKC5\":[\"LinkedIn (opens in new tab)\"],\"Gg69LR\":[\"LinkedIn URL\"],\"2WIZYd\":[\"Lithuania 🇱🇹\"],\"AHVzME\":[\"Live data and AI built\"],\"GObQuL\":[\"Live updates\"],\"zmRZwk\":[\"Live updates are unavailable, which is almost more honest.\"],\"ObPscj\":[\"Loading activation…\"],\"Oyf4mg\":[\"Loading form…\"],\"Pwqkdw\":[\"Loading…\"],\"7VBQ2j\":[\"Local, Production\"],\"JO8Bdx\":[\"Lock-in\"],\"sQia9P\":[\"Log in\"],\"KPLAuI\":[\"Lower CRM cost\"],\"J13skq\":[\"Luxembourg 🇱🇺\"],\"nRYQC8\":[\"Madagascar 🇲🇬\"],\"/hmUGb\":[\"Maintenance mode\"],\"BNd15Z\":[\"Make your GTM team happy with *a CRM they'll love*\"],\"qHvKxh\":[\"Malawi 🇲🇼\"],\"tF97tn\":[\"Malay\"],\"DIOh5g\":[\"Malaysia 🇲🇾\"],\"62/ScF\":[\"Maldives 🇲🇻\"],\"wc5E/3\":[\"Mali 🇲🇱\"],\"04fjhR\":[\"Malta 🇲🇹\"],\"Si4WyF\":[\"Management Consulting\"],\"TMZPkv\":[\"Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run.\"],\"poX06f\":[\"Manual work at core\"],\"VJOKPB\":[\"Maps view\"],\"Zt5PUS\":[\"Marketplace\"],\"2jVbnO\":[\"Marshall Islands 🇲🇭\"],\"bJNKJ1\":[\"Master every corner of Twenty\"],\"HG/EUg\":[\"Mauritania 🇲🇷\"],\"YDiaY/\":[\"Mauritius 🇲🇺\"],\"Zw+Zv+\":[\"MCP server\"],\"bwCiCi\":[\"Meet the certified agencies and consultants implementing Twenty for teams worldwide.\"],\"ujYZ+f\":[\"Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks.\"],\"CQ9M36\":[\"MENA\"],\"+9RIKB\":[\"Merge Records\"],\"briyJf\":[\"Metrics you can actually trust.\"],\"YBLFQZ\":[\"Mexico 🇲🇽\"],\"KBirDR\":[\"Micronesia 🇫🇲\"],\"YeVpda\":[\"Microsoft o365 Integration\"],\"so04x6\":[\"Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it.\"],\"izddzp\":[\"Mike Babiy\"],\"3TSz9S\":[\"Minimize\"],\"FFFENV\":[\"Minimum project budget\"],\"179i38\":[\"Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place.\"],\"6m8rMT\":[\"Moldova 🇲🇩\"],\"qRRmSe\":[\"Monaco 🇲🇨\"],\"G+EV+A\":[\"Mongolia 🇲🇳\"],\"9VDoNp\":[\"Montenegro 🇲🇪\"],\"+8Nek/\":[\"Monthly\"],\"paxFAm\":[\"More field relations\"],\"kHdAOE\":[\"More Field Types, More Power\"],\"VqXuUv\":[\"More options available!\"],\"AZrhlt\":[\"More powerful search\"],\"LAFO4Y\":[\"Morocco 🇲🇦\"],\"E4h9+U\":[\"Morph Many Relationships\"],\"EwJDrS\":[\"Mozambique 🇲🇿\"],\"dlKkNL\":[\"Multi-file upload on records\"],\"4nwdYp\":[\"Multi-Record Workflow Triggers\"],\"S5w2Q/\":[\"Multi-Select Field\"],\"Gorywi\":[\"Multi-Workspace\"],\"QGWbbv\":[\"Myanmar 🇲🇲\"],\"6YtxFj\":[\"Name\"],\"yYmxee\":[\"Namibia 🇳🇦\"],\"zVOV14\":[\"Nauru 🇳🇷\"],\"Akl9+2\":[\"Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \\\"Close\\\" button.\"],\"TizFpt\":[\"Navigation menu\"],\"LfNsfa\":[\"Need a quick change? Skip the engineering ticket. Customize your workspace in minutes.\"],\"4sbgPq\":[\"Need help with customization?\"],\"LNVNNE\":[\"Nepal 🇳🇵\"],\"g60EgR\":[\"Netherlands 🇳🇱\"],\"8Cp4Of\":[\"NetZero\"],\"J8ZssL\":[\"NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems.\"],\"7HVBV+\":[\"NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows.\"],\"3PtYTO\":[\"NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation.\"],\"zgjuZq\":[\"New Array field type\"],\"cU1+gU\":[\"New record page\"],\"pAKqTG\":[\"New Settings layout\"],\"a54odP\":[\"New Side Panel\"],\"/DTtCF\":[\"New Zealand 🇳🇿\"],\"GY6uSc\":[\"Next →\"],\"KqojOL\":[\"Next steps\"],\"awYrJD\":[\"Next testimonial\"],\"iBOZv7\":[\"Nicaragua 🇳🇮\"],\"61NU7V\":[\"Niger 🇳🇪\"],\"+2NLII\":[\"Nigeria 🇳🇬\"],\"qZ+egR\":[\"Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations.\"],\"sGuHDu\":[\"Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day.\"],\"G0GGKA\":[\"Nine Dots Ventures\"],\"1UzENP\":[\"No\"],\"6tRXQ4\":[\"No matching country.\"],\"1hNHaC\":[\"No more renting someone else's *structure*\"],\"LmWdm6\":[\"No more renting someone else's structure\"],\"UxK4so\":[\"No partners match your filters\"],\"nDjC8E\":[\"No session ID provided. Please complete the checkout first.\"],\"q9f4Tp\":[\"No-code\"],\"SiZ/7E\":[\"No. Build custom objects, fields, views, and no-code workflows straight from Settings. Unlimited, no extra charge.\"],\"096JXI\":[\"North Korea 🇰🇵\"],\"IwF7aJ\":[\"North Macedonia 🇲🇰\"],\"sZwk4U\":[\"Norway 🇳🇴\"],\"1IipHp\":[\"Norwegian\"],\"YfzRVa\":[\"Notes and Tasks standard objects\"],\"iDNBZe\":[\"Notifications\"],\"k3T2mM\":[\"Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you.\"],\"CzeIij\":[\"Number of dashboards\"],\"pkrZnO\":[\"Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first.\"],\"l/1LQc\":[\"Olivier Reinaud\"],\"BdShAR\":[\"Oman 🇴🇲\"],\"D2b+1q\":[\"On a single CRM\"],\"w5ATz2\":[\"On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones.\"],\"XhXmzW\":[\"On this page\"],\"jxC7HY\":[\"Onboarding · Documentation · Change management · L1/L2 support · Managed services\"],\"pbmZ7R\":[\"Onboarding Packs\"],\"37OSdM\":[\"One *API* to rule them all\"],\"Zt1UZb\":[\"One API to rule them all\"],\"pShqss\":[\"Only $5 for SSO. Practically a charity program.\"],\"GSr0rF\":[\"Open menu\"],\"pkXQA+\":[\"Open your Twenty self-hosted instance Settings → Enterprise.\"],\"5RkmVr\":[\"Open-source, AI-ready, and yours to shape.\"],\"ucgZ0o\":[\"Organization\"],\"nDTfhz\":[\"Other improvements\"],\"3PlK59\":[\"Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden.\"],\"dKGg8T\":[\"Out of stock\"],\"PASC/7\":[\"Outlived every redesign since 2004.\"],\"Bwsi7B\":[\"Own your CRM end to end\"],\"oDAEQq\":[\"Ownership\"],\"NmF/Vo\":[\"Owning your stack remains mysteriously out of stock.\"],\"h/oMMb\":[\"Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform.\"],\"+AiiMt\":[\"Pagination builds character.\"],\"sW3DaS\":[\"Pakistan 🇵🇰\"],\"cvRU36\":[\"Palau 🇵🇼\"],\"u2htNd\":[\"Palestine 🇵🇸\"],\"pWLp16\":[\"Panama 🇵🇦\"],\"xOR4tu\":[\"Papua New Guinea 🇵🇬\"],\"kb3PhK\":[\"Paraguay 🇵🇾\"],\"cLitIC\":[\"Partner application\"],\"mYGIvm\":[\"Partner facts and contact\"],\"4RPECg\":[\"Partner not found — Twenty Partners\"],\"dRIK0d\":[\"Partner testimonials\"],\"mPkInZ\":[\"Partners\"],\"9yo8NN\":[\"Paste the key and click Activate.\"],\"TMErUt\":[\"Percentage in number fields\"],\"v1i9+n\":[\"Performance Improvements\"],\"JjOHl8\":[\"Permissions V1\"],\"kJQ+gL\":[\"Permissions V2\"],\"OzAIDr\":[\"Peru 🇵🇪\"],\"LqRs8D\":[\"Philippines 🇵🇭\"],\"we6gj5\":[\"Pick every category that applies.\"],\"KEEuJt\":[\"Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client.\"],\"FFkjaT\":[\"Pipeline Management\"],\"gzkkC3\":[\"Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use.\"],\"z7gnI9\":[\"Please complete all required fields before continuing.\"],\"AFr2a5\":[\"Poland 🇵🇱\"],\"trnWaw\":[\"Polish\"],\"/LAeug\":[\"Portrait of \",[\"authorName\"]],\"8BrmUs\":[\"Portugal 🇵🇹\"],\"MOERNx\":[\"Portuguese\"],\"z87IFG\":[\"Press Enter or comma to add a skill.\"],\"LZoO8F\":[\"Previous testimonial\"],\"a7u1N9\":[\"Price\"],\"aHCEmh\":[\"Pricing\"],\"T/R+Qz\":[\"Primary\"],\"J2IAmT\":[\"Principal and Founder\"],\"kXBQYM\":[\"Principal and Founder, Alternative Partners\"],\"k62X/2\":[\"Priority support\"],\"LcET2C\":[\"Privacy Policy\"],\"DJ3uVe\":[\"Privacy Policy | Twenty\"],\"3fPjUY\":[\"Pro\"],\"K47k8R\":[\"Product\"],\"kIGKva\":[\"Production grade quality\"],\"vERlcd\":[\"Profile\"],\"CcK9cq\":[\"Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around.\"],\"PaHxQd\":[\"Project minimum\"],\"9NAqO4\":[\"Proposal automation\"],\"a24q7E\":[\"Proprietary languages, slow deployment cycles, and \\\"black box\\\" logic.\"],\"u9RZ7+\":[\"Punjabi\"],\"frfCYp\":[\"Q1 2026\"],\"tFx+ES\":[\"Qatar 🇶🇦\"],\"OialmJ\":[\"Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input.\"],\"3XOwjg\":[\"Rates\"],\"zXRspj\":[\"Rating field\"],\"DnWJal\":[\"Reach out\"],\"gSQVmr\":[\"Read the case\"],\"EqCbT9\":[\"Read/Edit/Delete permissions\"],\"/6qiAz\":[\"Ready to build\\n*your own story?*\"],\"TqQ08B\":[\"Ready to grow\\n*with Twenty?*\"],\"zTY2by\":[\"Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit.\"],\"NIwjHh\":[\"Real Estate\"],\"CH+Ona\":[\"Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth.\"],\"5O1eTm\":[\"Real-time changes? That will be a premium surprise.\"],\"4hc7hc\":[\"Real-time data\"],\"dKQCrj\":[\"Real-time is a state of mind, not a feature.\"],\"P7gVBH\":[\"Record is created or updated trigger\"],\"Zhiuz9\":[\"Record quarter\"],\"PWlTvh\":[\"Records\"],\"q45OlW\":[\"Regions\"],\"GtQZI0\":[\"Relation Fields on Record Page\"],\"plY6Rp\":[\"Relations on Record Pages\"],\"rwWjWg\":[\"Release Notes\"],\"5icoS1\":[\"Releases\"],\"BkBq/5\":[\"Remove \",[\"0\"],\" filter\"],\"OY7BZk\":[\"Remove \",[\"skill\"]],\"a/aGHe\":[\"Rename, download, and delete attachments\"],\"t9yxlZ\":[\"Reports\"],\"SY/an2\":[\"Reports & Dashboards\"],\"TD9BOQ\":[\"Reset conversation\"],\"ZYyPd8\":[\"Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts.\"],\"tpLAlL\":[\"Resize navbar and side panel\"],\"s+MGs7\":[\"Resources\"],\"oC2l7f\":[\"REST & GraphQL API\"],\"kx0s+n\":[\"Results\"],\"2itg0p\":[\"Retro 2015\"],\"H0dEn+\":[\"Return traffic light\"],\"k2x4+M\":[\"Revamp View Options Menu\"],\"7xiRJz\":[\"Revamped Navigation Bar\"],\"lHXjXQ\":[\"Revamped Side Panel\"],\"frqduN\":[\"Rich notes attached to records\"],\"i4ofLR\":[\"Rich text layouts\"],\"/gaSVU\":[\"Roadmap\"],\"mLp5AP\":[\"Romania 🇷🇴\"],\"uJc01W\":[\"Romanian\"],\"Wdh41P\":[\"Row-level permissions\"],\"mRpuWW\":[\"Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks.\"],\"T1ut28\":[\"Russia 🇷🇺\"],\"nji0/X\":[\"Russian\"],\"dw8D3T\":[\"Rwanda 🇷🇼\"],\"niLOap\":[\"Saint Kitts & Nevis 🇰🇳\"],\"zCHzF/\":[\"Saint Lucia 🇱🇨\"],\"Md/8iQ\":[\"Saint Vincent 🇻🇨\"],\"Burn4/\":[\"Salesfarce Add-on Center\"],\"xTfEgV\":[\"Salesfarce Pro\"],\"/UolBB\":[\"Salesforce Classic\"],\"l69E+u\":[\"Salesforce migration\"],\"CADlRK\":[\"Same CRM\"],\"60i6S+\":[\"Same output\"],\"xl2tJ9\":[\"Same results\"],\"w9QWxz\":[\"SAML/OIDC SSO\"],\"R38ZPo\":[\"Samoa 🇼🇸\"],\"fK288K\":[\"San Marino 🇸🇲\"],\"KDcBQd\":[\"São Tomé & Príncipe 🇸🇹\"],\"/BK0Nl\":[\"Saudi Arabia 🇸🇦\"],\"elz5ka\":[\"Saved / month\"],\"h3C5H8\":[\"Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace.\"],\"bifv6N\":[\"Scale\"],\"aI/fdL\":[\"Scale without *breaking operations*\"],\"842ybw\":[\"Scale without breaking operations\"],\"vk6sVR\":[\"Search a country…\"],\"+yNkue\":[\"Search in field pickers and add-column menus makes table and layout customization faster.\"],\"HVOGoW\":[\"Seats limit\"],\"a3LDKx\":[\"Security\"],\"nmVU/t\":[\"See how teams\\nbuild *on Twenty*\"],\"aB+XpI\":[\"See more features\"],\"JDp1bg\":[\"See updates as they happen. Work with your team and agents seamlessly.\"],\"0kgOPB\":[\"See what shipped in \",[\"0\"]],\"02ePaq\":[\"Select \",[\"0\"]],\"wgNoIs\":[\"Select all\"],\"6p/m5q\":[\"Select your country\"],\"sXYD/i\":[\"self\"],\"6JhL+3\":[\"Self-hosted\"],\"QFK/45\":[\"Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring\"],\"42Nf4Y\":[\"Self-hosted *means control*\"],\"zuU9UU\":[\"Self-hosted billing\"],\"5CWy3T\":[\"Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs.\"],\"5WmQ5O\":[\"Self-hosted means control\"],\"WxVgfh\":[\"Self-hosted workspaces can now track usage more cleanly with usage-based billing support.\"],\"GrBvv/\":[\"Self-hosting\"],\"YdhUoe\":[\"Self-hosting, now for rent!\"],\"uVBq8r\":[\"Self-Onboarding\"],\"NaHz2o\":[\"Selfhosting\"],\"pi1oME\":[\"Send message\"],\"D50Vyu\":[\"Senegal 🇸🇳\"],\"eEJlq0\":[\"Serbia 🇷🇸\"],\"62gxWx\":[\"Seychelles 🇸🇨\"],\"3VFzsh\":[\"Ship a product on Twenty\"],\"Ta0ts5\":[\"Show changes\"],\"6lGV3K\":[\"Show less\"],\"RhU4bB\":[\"Showing \",[\"visibleCount\"],\" of \",[\"totalCount\"],\" partners\"],\"I89wN/\":[\"Showing all \",[\"totalCount\"],\" partners\"],\"9k9PMD\":[\"Sidebar items\"],\"yhyNch\":[\"Sierra Leone 🇸🇱\"],\"mA6cL1\":[\"Sign up for Cloud in under a minute and start your 30-day trial. For larger rollouts, our 4-hour Onboarding Packs or certified partners get you live in 1–2 weeks.\"],\"qTFDyz\":[\"Simple\\n*Pricing*\"],\"0eG5g+\":[\"Singapore 🇸🇬\"],\"V9dFwD\":[\"Sitemap\"],\"c+cRP3\":[\"Skeleton Loading\"],\"PCSkw2\":[\"Skills\"],\"t6ComU\":[\"Skip the clunky UX that always comes with custom.\"],\"U7keXg\":[\"Slovakia 🇸🇰\"],\"o1VTTF\":[\"Slovenia 🇸🇮\"],\"1v/aHN\":[\"Smart ⌘K\"],\"bUmSwL\":[\"Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute.\"],\"GUqjZ0\":[\"Social media\"],\"b+F/Ih\":[\"Soft Delete\"],\"L58Ivq\":[\"Soft delete feature added: Deleted records are now hidden from view but recoverable from the \\\"Deleted record\\\" option in any object options menu. No more drama!\"],\"6sKjjx\":[\"Solo\"],\"FX2oa1\":[\"Solo or agency?\"],\"TcZtfs\":[\"Solomon Islands 🇸🇧\"],\"TvdMI3\":[\"Solutioning\"],\"t1E06j\":[\"Somalia 🇸🇴\"],\"AVfp38\":[\"Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons.\"],\"Lllsp+\":[\"Some teammate changes now appear right away, so collaboration feels faster and more up to date.\"],\"B/mYo/\":[\"Source code access\"],\"zHJB/O\":[\"South Africa 🇿🇦\"],\"7MdTKh\":[\"South Korea 🇰🇷\"],\"a4jo+V\":[\"South Sudan 🇸🇸\"],\"Kv3C8d\":[\"Spain 🇪🇸\"],\"65A04M\":[\"Spanish\"],\"00jcbn\":[\"Sri Lanka 🇱🇰\"],\"vnS6Rf\":[\"SSO\"],\"uQl22y\":[\"Standard support\"],\"wxW2Sv\":[\"Start automating at huge scale!\"],\"XO628f\":[\"Start for free\"],\"sBOFB0\":[\"Start your free trial today\\nwithout credit card.\"],\"ThcPyu\":[\"Stay in control with our *open-source software*\"],\"j9c8rb\":[\"Stay in Flow\"],\"GdGiNi\":[\"Step \",[\"current\"],\" of \",[\"total\"]],\"bxgoJR\":[\"Step-by-step guides and playbooks to help your team get the most out of their workspace.\"],\"jKt86V\":[\"Stop fighting custom. *Start building, with Twenty*\"],\"UCLArd\":[\"Stop settling for trade-offs.\"],\"hjgBcp\":[\"Stop Workflow Button\"],\"3QIOGT\":[\"Sub-field Filtering\"],\"eVPr22\":[\"Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field.\"],\"Sv4BSp\":[\"Subdomain (yourco.twenty.com)\"],\"H5/rZQ\":[\"Submit application\"],\"MDqQmP\":[\"Submitting…\"],\"8Z1557\":[\"Sudan 🇸🇩\"],\"XYLcNv\":[\"Support\"],\"Aq66kg\":[\"Suriname 🇸🇷\"],\"Yz+oFV\":[\"Swahili\"],\"6u3kqB\":[\"swap\"],\"b2//Ip\":[\"Sweden 🇸🇪\"],\"UaISq3\":[\"Swedish\"],\"IImT5c\":[\"Switzerland 🇨🇭\"],\"sjuSub\":[\"Syria 🇸🇾\"],\"3w+Aox\":[\"Table, Kanban, Calendar\"],\"ISVD3+\":[\"Tagalog\"],\"9M02G5\":[\"Tailor record pages, menus, and views\"],\"boABlR\":[\"Taiwan 🇹🇼\"],\"XJspRJ\":[\"Tajikistan 🇹🇯\"],\"jYsF4G\":[\"Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time.\"],\"JAKtcG\":[\"Talk to us\"],\"fb427h\":[\"Tamil\"],\"ri1l89\":[\"Tanzania 🇹🇿\"],\"GWMpL3\":[\"Tasks & Activities\"],\"Ye3KKA\":[\"Team up with a Twenty expert\"],\"vsdUaL\":[\"Technical notes\"],\"y+bLyB\":[\"Technical skills\"],\"Hevu8X\":[\"Terminal mode\"],\"mvP/25\":[\"Terms and Conditions\"],\"xowcRf\":[\"Terms of Service\"],\"BEX1RA\":[\"Terms of Service | Twenty\"],\"VUZDlr\":[\"Testimonials\"],\"SUr44j\":[\"Thai\"],\"6t7gpr\":[\"Thailand 🇹🇭\"],\"Pa/Y6/\":[\"Thanks, you're in.\\n*Now book your intro call.*\"],\"FjkPYg\":[\"That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients.\"],\"8S4psU\":[\"That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer.\"],\"zXlFuT\":[\"The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business.\"],\"K1T7Mn\":[\"The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record.\"],\"KzqOXm\":[\"The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \\\"Retail,\\\" \\\"Technology,\\\" and \\\"Finance,\\\" enabling more nuanced segmentation and analysis.\"],\"6wVgAW\":[\"The bet is *paying off*\"],\"NT2bSJ\":[\"The bet is paying off\"],\"Wie492\":[\"The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in.\"],\"2kHqXc\":[\"The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them.\"],\"EYi+kT\":[\"The CRM as a *control hub*\"],\"2sfVd8\":[\"The CRM as a control hub\"],\"XlFsoH\":[\"The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant.\"],\"kCUcnD\":[\"The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed.\"],\"MaHqAc\":[\"The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly.\"],\"Q5iZ9Q\":[\"The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy.\"],\"l0eUFC\":[\"The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever.\"],\"SW9clW\":[\"The future of CRM is built, *not bought.*\"],\"sm10Rg\":[\"The Giant Monolith\"],\"nFB8I1\":[\"The In-house Burden\"],\"ZNzKXV\":[\"The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic.\"],\"nf1NnD\":[\"The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields.\"],\"tADBQB\":[\"The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads.\"],\"q1kKLq\":[\"The opportunity\"],\"80f4ed\":[\"The principles and product philosophy behind the open source CRM.\"],\"2NJdyz\":[\"The Problem.\"],\"GTy93s\":[\"The record page now features a clearer layout with increased space for content\"],\"3/wAFg\":[\"The result\"],\"nAWeyi\":[\"The result is a system that fits how AC&T already worked, instead of the other way around.\"],\"WENmFq\":[\"The right *foundation*\"],\"nbHA9N\":[\"The right foundation\"],\"g8h2v+\":[\"The search feature now includes ranking scores. This helps you find the most relevant results faster.\"],\"9CCRtB\":[\"The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results.\"],\"omVXTg\":[\"The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source.\"],\"1tN3qf\":[\"The shift\"],\"iW6MjB\":[\"The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature.\"],\"AnGOwN\":[\"The situation\"],\"gXGp3Q\":[\"The story behind Twenty\"],\"axo4rg\":[\"The terms governing your use of Twenty and its open source CRM services.\"],\"xCAT8U\":[\"The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events\"],\"u0uFxg\":[\"They are the real sales\"],\"53RXLB\":[\"They call it customer loyalty. We call it a very affectionate cage.\"],\"RhmZMe\":[\"They did not just replace a tool. They took back ownership of how their business runs.\"],\"ZnqwXn\":[\"They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother.\"],\"5YzqyT\":[\"They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control.\"],\"AUV+TY\":[\"Thinking\"],\"8gek0+\":[\"This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate.\"],\"6f8QUY\":[\"Timor-Leste 🇹🇱\"],\"WwTFtc\":[\"To enhance privacy, you can now add specific email addresses to a blocklist within the \\\"Accounts\\\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals.\"],\"ijf9QM\":[\"To maintain the simplicity of Twenty, we are introducing \\\"Advanced Settings.\\\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings.\"],\"DeTupk\":[\"Togo 🇹🇬\"],\"CocxTO\":[\"Tonga 🇹🇴\"],\"5eFktS\":[\"Tool integration\"],\"xv7HSr\":[\"total per month with fixed cost\"],\"hmu++i\":[\"Track amount and close date\"],\"POzmFl\":[\"Track every release with changelogs, highlights and demos of the newest features.\"],\"6vHPh9\":[\"Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence.\"],\"xwWQ9Q\":[\"Training & Adoption\"],\"MtCqjl\":[\"Training, Adoption & Support\"],\"VhVAzf\":[\"Translation in 30+ Languages\"],\"/ga9kq\":[\"Trinidad & Tobago 🇹🇹\"],\"tdZpCd\":[\"Trust Center\"],\"HlusPQ\":[\"Trust the n°1 CRM, *or not!*\"],\"KtyN0b\":[\"trusted by\"],\"QZdPWP\":[\"Trusted by leading organizations\"],\"eslLQF\":[\"Try it live\"],\"qhmtws\":[\"Try removing some filters or browse all partners.\"],\"E/hGy3\":[\"Try Twenty Cloud\"],\"D5Kf4t\":[\"Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours.\"],\"y4UxlS\":[\"Tunisia 🇹🇳\"],\"UIDKnJ\":[\"Turkey 🇹🇷\"],\"Kz91g/\":[\"Turkish\"],\"kdJl4v\":[\"Turkmenistan 🇹🇲\"],\"tSc/a3\":[\"Tuvalu 🇹🇻\"],\"O5dAmW\":[\"Twenty | #1 Open Source CRM\"],\"NalB1c\":[\"Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform.\"],\"fZsVj6\":[\"Twenty as the\\n*API backbone* of a go-to-market stack\"],\"+w9xZW\":[\"Twenty as the API backbone of a go-to-market stack\"],\"zj0CA+\":[\"Twenty as the API backbone of a go-to-market stack | Elevate Consulting\"],\"neM1Ol\":[\"Twenty CRM Features — Modern Open Source CRM Platform\"],\"8zCqPL\":[\"Twenty CRM Pricing — Plans from $9 per User per Month\"],\"D05UQH\":[\"Twenty Customers — How Modern Teams Run Their CRM\"],\"MYHdd/\":[\"Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market.\"],\"fwep/o\":[\"Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it.\"],\"0qyMhk\":[\"Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves.\"],\"jVhq41\":[\"Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform.\"],\"x/I85y\":[\"Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible.\"],\"zvfdHM\":[\"Twenty is the heart of the system. Everything branches from it.\"],\"K+zzSQ\":[\"Twenty lets us build a CRM around the business and not the business around the CRM.\"],\"AxT+g4\":[\"Twenty makes it simple. It's clean, intuitive, and built to feel like Notion.\"],\"mZ3xRm\":[\"Twenty partner ecosystem\"],\"4SJucz\":[\"Twenty Partners — Certified Open Source CRM Implementers\"],\"vD7S1X\":[\"Twenty release \",[\"0\"],\" — \",[\"1\"]],\"X1GHuJ\":[\"Twenty Releases — What's New in the Open Source CRM\"],\"V1lV7B\":[\"Twenty team support\"],\"osa7Xg\":[\"Twenty user guide preview\"],\"KsFvUt\":[\"Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call.\"],\"tuvLv1\":[\"Two Factor Authentication\"],\"EIU345\":[\"Two-factor authentication\"],\"O+vc/1\":[\"Type of team *\"],\"P+R1Lc\":[\"Typical project\"],\"HqFilh\":[\"UAE 🇦🇪\"],\"+WNTxL\":[\"Uganda 🇺🇬\"],\"uxuy4l\":[\"UI theme\"],\"tNfmmF\":[\"UK 🇬🇧\"],\"z7UkhA\":[\"Ukraine 🇺🇦\"],\"V9+2pH\":[\"Ukrainian\"],\"jqzUyM\":[\"Unavailable\"],\"Hix/m6\":[\"Unified timeline (emails, events, tasks, notes, files)\"],\"NIuIk1\":[\"Unlimited\"],\"q7vKOJ\":[\"Unlisted Views\"],\"aGpTSC\":[\"Up to 5 workspaces\"],\"KQsreu\":[\"Updated by\"],\"SPdRRU\":[\"Upfront consulting, scoping, strategy.\"],\"WLb3m4\":[\"Upgraded Search\"],\"2vanwz\":[\"Upload, rename, preview, and manage files directly on records. Everything stays where it belongs.\"],\"tmwuH9\":[\"Urdu\"],\"huOaG8\":[\"Uruguay 🇺🇾\"],\"RCOibx\":[\"US\"],\"LXHEIS\":[\"USA 🇺🇸\"],\"Roaswv\":[\"User Guide\"],\"9iX1i3\":[\"User impersonation\"],\"3XIgKU\":[\"User roles\"],\"UCUX2+\":[\"User-side rollout & ongoing support.\"],\"FOOEtP\":[\"Uzbekistan 🇺🇿\"],\"CRXL2j\":[\"Vanuatu 🇻🇺\"],\"NNeEYO\":[\"Vatican 🇻🇦\"],\"BWzac4\":[\"Venezuela 🇻🇪\"],\"fDWr8s\":[\"Version control\"],\"FlQ1vR\":[\"Vietnam 🇻🇳\"],\"fROFIL\":[\"Vietnamese\"],\"BRBSny\":[\"View \",[\"0\"],\" on LinkedIn\"],\"V4nZs/\":[\"View Groups\"],\"ITdNGt\":[\"View on LinkedIn\"],\"73lp8c\":[\"View profile\"],\"BAzC1v\":[\"View types\"],\"mHtVst\":[\"Visualize your customers on a map!\"],\"CsHuOr\":[\"VP of Engineering\"],\"uRh799\":[\"VP of Engineering at W3villa Technologies\"],\"w2INie\":[\"VP of Engineering, W3villa Technologies\"],\"s0tU5h\":[\"W3Grads\"],\"R8BueT\":[\"W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone.\"],\"7hHsoV\":[\"W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone.\"],\"QBOUnd\":[\"W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing.\"],\"7q5Vjn\":[\"W3villa Technologies\"],\"ZabLEt\":[\"W3villa Technologies set out to solve it properly, not with a workaround, but with a product.\"],\"3v2ipf\":[\"W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves.\"],\"k1Pevc\":[\"We are pleased to reopen the cloud subscription to everyone. No more waiting!\"],\"8CHatv\":[\"We could not submit your application. Please try again in a moment.\"],\"ofRgSN\":[\"We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind.\"],\"MjWeUE\":[\"We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind.\"],\"GVxbgf\":[\"We have improved app performance, shaving off over 500ms on each page.\"],\"6C4xTI\":[\"We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks.\"],\"l7iJRt\":[\"We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV.\"],\"d5CWI6\":[\"We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us.\"],\"DFlq8J\":[\"We’ve added an \\\"any field search\\\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \\\"Mobile,\\\" \\\"Office,\\\" or \\\"Direct Line\\\" field.\"],\"kenNyf\":[\"We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars.\"],\"5CT1rV\":[\"We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!\"],\"xBnjMX\":[\"We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well.\"],\"v1kQyJ\":[\"Webhooks\"],\"ZhnM/K\":[\"Webhooks (Change Data Capture)\"],\"K4G86X\":[\"Webhooks filter\"],\"FaPmsq\":[\"Webhooks multi-object filtering\"],\"hgDePr\":[\"Website or GitHub\"],\"Lx0cVD\":[\"What an admin can do without writing code.\"],\"Z34FQq\":[\"What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company.\"],\"phiBjc\":[\"What does Twenty cost?\"],\"WVQaGB\":[\"What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible.\"],\"iOAq7n\":[\"What is next\"],\"tWd6MT\":[\"What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together.\"],\"kRfFDB\":[\"What they do\"],\"aYRqmz\":[\"What this means\"],\"QCHIzm\":[\"What you cover *\"],\"1kfjxX\":[\"Whatever came next had to be something they could own.\"],\"cs6VpJ\":[\"When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop.\"],\"chISDP\":[\"When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects.\"],\"qqPUvu\":[\"When the channel is *the business*\"],\"JglRo/\":[\"When the channel is the business\"],\"nkkLPM\":[\"When the vendor *pulled the plug*\"],\"DajeYD\":[\"When the vendor pulled the plug\"],\"8SbakK\":[\"When your CRM is\\n*the product*\"],\"OQ41z8\":[\"When your CRM is the product\"],\"Svuneu\":[\"When your CRM is the product: W3Grads on Twenty | W3villa Technologies\"],\"2O07UN\":[\"Where & how\"],\"bGN8u+\":[\"While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty.\"],\"DJlSwA\":[\"Why\"],\"mrxgOV\":[\"Why teams choose Twenty\"],\"4sOVu+\":[\"Why Twenty\"],\"DH7vVZ\":[\"Why Twenty — The Open Source CRM Built to Be Customised\"],\"tetjz4\":[\"Why Twenty illustration\"],\"7KJZ0z\":[\"Window controls\"],\"V+BOYT\":[\"With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control.\"],\"edwOmb\":[\"With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines.\"],\"OKVlnc\":[\"With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket.\"],\"OX5bbs\":[\"Work email *\"],\"5VGHpF\":[\"Workflow branches\"],\"9MLcn+\":[\"Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation.\"],\"XYIks/\":[\"Workflow Bulk Select\"],\"gDMfQI\":[\"Workflow Filters\"],\"aNVMLK\":[\"Workflow improvements\"],\"EnPi2W\":[\"Workflow Iterator Node\"],\"jN2u/p\":[\"Workflow Search Node Limit\"],\"woYYQq\":[\"Workflows\"],\"OteDxj\":[\"Workflows that *actually get used*\"],\"AzqmMJ\":[\"Workflows that actually get used\"],\"pmUArF\":[\"Workspace\"],\"bwECg/\":[\"Workspace URL, customer references, relevant links…\"],\"p3ZD6C\":[\"X (opens in new tab)\"],\"zkWmBh\":[\"Yearly\"],\"S6izIJ\":[\"Yemen 🇾🇪\"],\"l75CjT\":[\"Yes\"],\"bo6pUs\":[\"Yes, with our Apps framework. Scaffold an extension with `npx create-twenty-app` and ship custom objects, server-side logic functions, React components that render inside Twenty’s UI, AI skills and agents, views, and navigation, all in TypeScript, deployable to any workspace.\"],\"yIcBW6\":[\"Yes. Every Cloud workspace ships with a native MCP server. Connect your AI assistant via OAuth and it can read and write your CRM data in natural language.\"],\"8xYMYQ\":[\"Yes. Import your data via CSV, or use our API for 50,000+ records. Our partners can handle the full migration for you.\"],\"8m0eN9\":[\"Yes. Twenty is the #1 Open Source CRM on GitHub. You can self-host to fully own your infrastructure, or run it on our managed cloud for a zero-ops setup.\"],\"Q3GDrw\":[\"You can now add your views to favorites for quick access and organize your favorites into folders for better management.\"],\"wvm+7M\":[\"You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions.\"],\"Wg/o59\":[\"You can now create number fields that display a percentage instead of a regular number.\"],\"BAWUUs\":[\"You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link.\"],\"nbc7CM\":[\"You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)\"],\"dCaNPC\":[\"You can now edit one-to-many relations directly from the \\\"many side\\\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company.\"],\"HX2309\":[\"You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field.\"],\"/eqpqH\":[\"You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created.\"],\"HeaQGk\":[\"You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience.\"],\"l2z97k\":[\"You can now link your Microsoft account to easily manage your messages and events right within your workspace.\"],\"QN6ytb\":[\"You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection.\"],\"pYoGew\":[\"You can now navigate from one object to another directly from the record detail page.\"],\"mpOPSr\":[\"You can now preview file attachments without downloading them.\"],\"PoxYsC\":[\"You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons.\"],\"S4LCu8\":[\"You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content.\"],\"uS4RtA\":[\"You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently\"],\"px+QAM\":[\"You can now see who last updated a record\"],\"OVoVQg\":[\"You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace.\"],\"eheMXY\":[\"You can now trigger workflows when a record is created or updated.\"],\"XEEpNj\":[\"You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object.\"],\"LJ3sTb\":[\"You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter.\"],\"AUzqeZ\":[\"You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows.\"],\"SfJVcK\":[\"Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance.\"],\"krHgj1\":[\"Your enterprise key\"],\"+dxjCu\":[\"Your enterprise license has been activated successfully.\"],\"pEQiCY\":[\"Your name *\"],\"fQATWn\":[\"Your network, fully mapped.\"],\"sgod9b\":[\"Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code.\"],\"CgGN5T\":[\"Zambia 🇿🇲\"],\"wHjFOw\":[\"Zero\"],\"ZvEoMq\":[\"Zero manual work at the core. Full automation. Built on Twenty.\"],\"TT3YXb\":[\"Zimbabwe 🇿🇼\"],\"ACjxWW\":[\"Zoom\"]}")as Messages; \ No newline at end of file diff --git a/packages/twenty-website-redone/src/locales/generated/es-ES.ts b/packages/twenty-website-redone/src/locales/generated/es-ES.ts deleted file mode 100644 index 25db36ea49..0000000000 --- a/packages/twenty-website-redone/src/locales/generated/es-ES.ts +++ /dev/null @@ -1 +0,0 @@ -/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"BUIzFF\":[\"-33% off\"],\"AGZHx4\":[\"...with AI that actually helps you *work faster*\"],\"Z6mKXu\":[[\"0\"],\" — Twenty Partner\"],\"sGt3Jm\":[[\"0\"],\" case study\"],\"jC5JCB\":[[\"count\"],\" Case Studies\"],\"NSO/FI\":[[\"hourly\"],\"/hr\"],\"rAP+km\":[[\"labelText\"],\" filter\"],\"7hlEpj\":[[\"labelText\"],\" filter, \",[\"0\"],\" selected\"],\"0Qb9by\":[\"*150 hours* saved every month\"],\"k3IzYC\":[\"*Zero manual work* at the core\"],\"icND7o\":[\"/ seat / month - billed yearly\"],\"XUqxHW\":[\"/user/month\"],\"UEDohT\":[\"© \",[\"year\"],\" – Twenty\"],\"2ygf/L\":[\"← Back\"],\"9j/bUt\":[\"← Twenty partners\"],\"foGG8A\":[\"+$105/user per month\"],\"Bsq9GJ\":[\"+$35/user per month\"],\"mWSpW5\":[\"+$5/user per month\"],\"JIwDAd\":[\"+$7000/org per month\"],\"yVr18d\":[\"+$75/user per month\\nSwitch to enterprise!\"],\"iK+ikF\":[\"+10k others\"],\"nRtVCK\":[\"+20% of net spend\\n+$75/user per month\\nSwitch to enterprise!\"],\"BmAWVq\":[\"<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management.\"],\"pQcyVv\":[\"<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\\\"No Value\\\" Column: Cards that are not assigned to a specific value will now appear in a \\\"No Value\\\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked.\"],\"cCqojY\":[\"<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access.\"],\"be30i9\":[\"$0\"],\"6inRXo\":[\"$1/orchestration run/org\\n+$75/user per month\\nSwitch to enterprise!\"],\"EkIZkY\":[\"$19\"],\"8r6DgO\":[\"$9\"],\"EHNAf2\":[\"1 click\"],\"qvNspm\":[\"1‑800‑YES‑SOFTWARE\"],\"6WQdu8\":[\"100 per minute\"],\"uuKUqZ\":[\"11 permissions\\ngroups\"],\"2szX5S\":[\"150\"],\"9ntyY8\":[\"150 hrs\"],\"2z1Znr\":[\"2 years contract\"],\"l6Vx4q\":[\"2,000+\"],\"FKcV/y\":[\"2025\"],\"PJgfBS\":[\"3\"],\"BL47wE\":[\"3 2 years contract\\n-33% off\"],\"/jgC+9\":[\"3 product lines\"],\"7SJhyh\":[\"30+\"],\"Pdl2UE\":[\"4 tools\"],\"2ScEtE\":[\"5 workflow credits/month included\"],\"hIKxCy\":[\"5,000\"],\"Z2TH0F\":[\"50 per minute\"],\"CiRGZ8\":[\"50 workflow credits/year included\"],\"tZvajW\":[\"6 workflows\"],\"fHxYPM\":[\"90%+\"],\"u6Xxdi\":[\"A business that does not fit a *template*\"],\"NLSM5L\":[\"A business that does not fit a template\"],\"SR9TmK\":[\"A CRM for teams that *move fast*\"],\"MXRINg\":[\"A CRM that\\n*grows* with you\"],\"diWAWP\":[\"A CRM that grows with you\"],\"och6cp\":[\"A CRM that grows with you | NetZero & Twenty\"],\"N3qsQD\":[\"A CRM they\\n*actually own*\"],\"muZzEA\":[\"A CRM they actually own\"],\"HSyZ9R\":[\"A custom CRM gives your org an edge, *but building one* comes with *tradeoffs*\"],\"Ll7vsZ\":[\"A demo worth a *thousand words*\"],\"uNIo/j\":[\"A modern CRM with *an intuitive interface*\"],\"sDJ4rX\":[\"A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views.\"],\"aYUQpm\":[\"A new maintenance mode helps admins pause workspace changes during sensitive operations.\"],\"P5BDuh\":[\"A platform ready to *grow*\"],\"rxMguZ\":[\"A platform ready to grow\"],\"vbJW8I\":[\"A real estate agency on WhatsApp built a\\n*CRM* around it\"],\"hwoGni\":[\"A real estate agency on WhatsApp built a CRM around it\"],\"WjUlJr\":[\"A retro theme as a paid add-on is somehow the most believable part.\"],\"r9Msiv\":[\"A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \\\"I want this\\\" and \\\"it's live\\\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption.\"],\"H1lDvm\":[\"Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update.\"],\"c0RR2h\":[\"About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together.\"],\"41o3VS\":[\"AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control.\"],\"TuJiQF\":[\"AC&T Education Migration\"],\"yHUdh6\":[\"AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export.\"],\"MPzy5R\":[\"AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%.\"],\"J+A83M\":[\"AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%.\"],\"Kqfsda\":[\"Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance.\"],\"muhZ+X\":[\"Activating your enterprise license…\"],\"+cggij\":[\"Activation failed. Please try again.\"],\"trCWSt\":[\"Activation response was incomplete.\"],\"Yyn/dP\":[\"Active filters\"],\"iNSn2+\":[\"Add files directly to records so documents, screenshots, and other assets stay attached to the right work.\"],\"x0pZJy\":[\"Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define.\"],\"woOp+c\":[\"Add objects and fields\"],\"ZuoQMi\":[\"Add records to filtered views\"],\"l3+wiC\":[\"Add rich text directly inside layouts with the new dedicated field widget.\"],\"ced+/c\":[\"Add Several emails for one contact\"],\"Y2K3rp\":[\"Add-ons\"],\"U4glZw\":[\"Added \\\"Group By\\\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu.\"],\"6u4D5m\":[\"Address Field Type\"],\"g1in8j\":[\"Admin Panel\"],\"Op7nVF\":[\"Adoption\"],\"SUk0w7\":[\"Advanced Email and Calendar Settings\"],\"dePx/O\":[\"Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction.\"],\"c0acMS\":[\"Advanced filters\"],\"JiIKww\":[\"Advanced Settings\"],\"2050Pj\":[\"Advisory & Discovery\"],\"QjSFuI\":[\"Afghanistan 🇦🇫\"],\"StqEz0\":[\"Africa\"],\"NmHsVh\":[\"Agency\"],\"vZKKhf\":[\"Aggregate, bar, line, and pie widgets\"],\"HURF9k\":[\"Aggregates\"],\"rp2omj\":[\"Agribusiness\"],\"jiGK6+\":[\"AI (Einstein)\"],\"aUn7Ps\":[\"AI & Automations\"],\"HbXHSp\":[\"AI agents\"],\"WGXwzu\":[\"AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain.\"],\"Rsxdfy\":[\"AI Agents with custom skills\"],\"JHi+LN\":[\"AI agents, chats, and MCP\"],\"n2fhCy\":[\"AI chat\"],\"YeA2Ox\":[\"AI Chat is easier to use with a cleaner experience and clearer model choices.\"],\"TfV/y9\":[\"AI chat, settings, and records in a side panels for fast, single-screen access.\"],\"R+bwFB\":[\"AI for rapid iterations\"],\"svfUwH\":[\"AI in the *migration workflow*\"],\"A6v5aI\":[\"AI in the migration workflow\"],\"t97j+F\":[\"AI-assisted\"],\"7xlBwk\":[\"Albania 🇦🇱\"],\"EszGq4\":[\"Algeria 🇩🇿\"],\"LIGwFL\":[\"Alternative Partners\"],\"GDVvyT\":[\"Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers.\"],\"CCrRuT\":[\"Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work.\"],\"UIu18Y\":[\"Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee.\"],\"+BHPrF\":[\"always\"],\"iFLhqi\":[\"Amrendra Pratap Singh\"],\"Sbiivs\":[\"Andorra 🇦🇩\"],\"Uv5eaJ\":[\"Angola 🇦🇴\"],\"qKANz3\":[\"Antigua & Barbuda 🇦🇬\"],\"BfeCSx\":[\"Any Field filter\"],\"aGCcXe\":[\"Any Questions?\"],\"lgSvgF\":[\"Anything else we should know?\"],\"pkMjbA\":[\"Anything that needs a developer.\"],\"dYZUP3\":[\"Anything that needs devops skills.\"],\"AfiWqP\":[\"APAC\"],\"/AMVjF\":[\"APEX tutorials\"],\"yKBF3l\":[\"API access\"],\"30KnZB\":[\"API calls\"],\"42FQ3y\":[\"API-first\"],\"azQMHP\":[\"APIs are extra. Simplicity has a price.\"],\"MqJvvH\":[\"APIs, SDKs and webhooks to extend Twenty and ship apps on top of your CRM data.\"],\"k8I7/G\":[\"Apply to build\\n*the future of CRM*\"],\"LJCDxT\":[\"Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM.\"],\"8HV3WN\":[\"Arabic\"],\"uicv6Z\":[\"Architecture\"],\"fT9xVz\":[\"Argentina 🇦🇷\"],\"3KxGep\":[\"Armenia 🇦🇲\"],\"S+Q+1d\":[\"Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams.\"],\"7UGCGX\":[\"Assemble, iterate and adapt a robust CRM, *that's quick to flex*\"],\"v7zTZl\":[\"Assign owners and due dates\"],\"awzjg/\":[\"Attachment Visualizer\"],\"fxL/Km\":[\"Attachments without the chaos.\"],\"y2W2Hg\":[\"Audit logs\"],\"tw0/s1\":[\"Australia 🇦🇺\"],\"4cf5s+\":[\"Austria 🇦🇹\"],\"FFv0Vh\":[\"Automation\"],\"SJ7WSP\":[\"Available on YouTube!\"],\"8d+jRc\":[\"Azerbaijan 🇦🇿\"],\"iH8pgl\":[\"Back\"],\"wIoAQo\":[\"Bahamas 🇧🇸\"],\"Rhju1T\":[\"Bahrain 🇧🇭\"],\"LxzgmZ\":[\"Bangladesh 🇧🇩\"],\"rtcPS0\":[\"Barbados 🇧🇧\"],\"RownlY\":[\"Based in\"],\"jQLfIW\":[\"Because apparently privacy feels more premium with a surcharge.\"],\"qEQv1F\":[\"Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform.\"],\"uIG0OH\":[\"Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites.\"],\"JGM+JO\":[\"Because true orchestration means putting a dollar sign on every dramatic entrance.\"],\"Z7U/Og\":[\"Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected.\"],\"kWm0dC\":[\"Become\\n*our partner*\"],\"PKMHNe\":[\"become a genius!\"],\"6ZCRfT\":[\"Become a partner\"],\"j+1dcz\":[\"Become a Twenty Partner — Apply\"],\"83Wi6G\":[\"Begin with production-grade *building blocks*\"],\"0TCnEf\":[\"Belarus 🇧🇾\"],\"qblg4t\":[\"Belgium 🇧🇪\"],\"pSF7xM\":[\"Belize 🇧🇿\"],\"Hds3Bq\":[\"Bengali\"],\"cTWkw3\":[\"Benin 🇧🇯\"],\"SYfuGP\":[\"Benjamin Reynolds\"],\"YfjrMq\":[\"Bertrams\"],\"mzTjnf\":[\"Better than Liquid Glass!\"],\"T1oJwH\":[\"Beyond *internal rollout*\"],\"OPnz/X\":[\"Bhutan 🇧🇹\"],\"8tzR0k\":[\"Billing period\"],\"BpyJwa\":[\"Blue developer illustration with branching arrows\"],\"TVJDFA\":[\"Bolivia 🇧🇴\"],\"MkvsWx\":[\"Book a call\"],\"Wzdd8u\":[\"Bosnia & Herzegovina 🇧🇦\"],\"wtNsrt\":[\"Botswana 🇧🇼\"],\"yCaNfF\":[\"Brazil 🇧🇷\"],\"bmk2dj\":[\"Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models.\"],\"VX4eI/\":[\"Brunei 🇧🇳\"],\"s4FVHa\":[\"Build a CRM your\\ncompetitors *can't buy.*\"],\"sbr0X/\":[\"Build a dashboard of pipeline by stage\"],\"uetyzD\":[\"Build a pipeline board grouped by stage\"],\"3+uH0v\":[\"Build an app\"],\"Utc5RF\":[\"Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads.\"],\"rdvFK9\":[\"Build it in an afternoon. *AI made the gap that small.*\"],\"e1u+Zh\":[\"Build on an open platform\"],\"yEKs3h\":[\"Build with your favorite tools\"],\"2FDUkV\":[\"Build your Enterprise CRM *at AI Speed*\"],\"SoAKmY\":[\"Built for speed\"],\"sdItv6\":[\"Bulgaria 🇧🇬\"],\"Lze0QH\":[\"Bulk Deletion\"],\"dNnRlc\":[\"Burkina Faso 🇧🇫\"],\"j8RGrG\":[\"Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty\"],\"jtdtLa\":[\"Burundi 🇧🇮\"],\"L40Ae7\":[\"Calendar / booking link\"],\"6DqzR/\":[\"Calendar View for Objects\"],\"4yFkf9\":[\"Cambodia 🇰🇭\"],\"AvRzYu\":[\"Cameroon 🇨🇲\"],\"wCALve\":[\"Can developers extend Twenty with code?\"],\"6mytgb\":[\"Can I migrate from Salesforce or HubSpot?\"],\"nEOTNi\":[\"Canada 🇨🇦\"],\"hRO6uK\":[\"Cape Verde 🇨🇻\"],\"qLBo3s\":[\"carousel\"],\"C6wh0T\":[\"Case\"],\"M1RLfx\":[\"Catalan\"],\"NUrY9o\":[\"Categories\"],\"dBApoS\":[\"Central African Republic 🇨🇫\"],\"iI3Dq9\":[\"Chad 🇹🇩\"],\"+DEogc\":[\"Change language\"],\"2D9CbR\":[\"Check more add-ons\"],\"2BY3So\":[\"Chile 🇨🇱\"],\"zG6t8U\":[\"China 🇨🇳\"],\"h1IXFK\":[\"Chinese\"],\"s2oWpP\":[\"Choose a language\"],\"AZNxzv\":[\"Choose a role directly when inviting a teammate to a workspace.\"],\"geiXTM\":[\"Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need.\"],\"TNVfAe\":[\"Choose how to display dates in any field using a universal Unicode date format that best suits your use case.\"],\"3wV73y\":[\"City\"],\"ZbCD7v\":[\"Classic never dies. It just gets extended one more time.\"],\"u8JHrO\":[\"Clear filters\"],\"yz7wBu\":[\"Close\"],\"cu6iol\":[\"Close dialog\"],\"vcpc5o\":[\"Close menu\"],\"oLsrmd\":[\"Close pricing window\"],\"R7zx6E\":[\"cloud\"],\"L/LPQZ\":[\"Cloud Pro is $9/user/month (yearly). Organization is $19/user/month and unlocks SSO and row-level permissions for teams that need finer access control.\"],\"WYgF8M\":[\"Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions.\"],\"1YncLF\":[\"Co-founder at NetZero\"],\"4QGkvo\":[\"co-founder of NetZero\"],\"vWaYWP\":[\"Co-founder, NetZero\"],\"dcLsG5\":[\"Colombia 🇨🇴\"],\"b5bnuN\":[\"Column-to-field mapping (including relations)\"],\"ofoEsM\":[\"Coming soon!\"],\"KGD9Kt\":[\"Commercial license (no AGPL obligations)\"],\"OnPROL\":[\"Commercials\"],\"chL5IG\":[\"Community\"],\"8CLnho\":[\"Community support\"],\"RxpseA\":[\"Comoros 🇰🇲\"],\"SHjhDC\":[\"Company or brand *\"],\"Fkb+LW\":[\"Compose your CRM and internal apps with a single extensibility toolkit.\"],\"kD7ZGH\":[\"Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation.\"],\"2DQw7/\":[\"Congo 🇨🇬\"],\"iSLIjg\":[\"Connect\"],\"90KBr0\":[\"Connect Google or Microsoft accounts\"],\"xgrBCK\":[\"Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically.\"],\"dGwMkb\":[\"Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team.\"],\"MVrQxI\":[\"Connected via API\"],\"cfAG43\":[\"Consulting\"],\"GsUBlG\":[\"Contact \",[\"partnerName\"]],\"Oii3vg\":[\"Contacts & Companies\"],\"24qVhV\":[\"Context lives with the record.\"],\"mXovG/\":[\"Continue iteration *without friction*\"],\"LqyWsJ\":[\"Contributors now have their very own hall of fame.\"],\"qVH+kL\":[\"Contributors page\"],\"+Uepfb\":[\"Control\"],\"GplbCP\":[\"Control without *the overhead*\"],\"wH1xmY\":[\"Control without drag\"],\"Bj7igG\":[\"Control without the overhead\"],\"PiH3UR\":[\"Copied!\"],\"he3ygx\":[\"Copy\"],\"7qTWwB\":[\"Copy the enterprise key above.\"],\"PXnj76\":[\"Copy this key and paste it into your Twenty self-hosted instance settings.\"],\"FapWIq\":[\"Core Features\"],\"Al/blj\":[\"Costa Rica 🇨🇷\"],\"1B8JTc\":[\"Costs down more than *90%*\"],\"cRA2/z\":[\"Country *\"],\"kCu+Rq\":[\"Create a Kanban view on any object and streamline processes like recruitment or onboarding.\"],\"Xn2Nlq\":[\"Create a workflow\"],\"+kFrvb\":[\"Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs.\"],\"t9znrt\":[\"Create and organize sidebar items more easily with a cleaner navigation setup.\"],\"B9nLrl\":[\"Create apps on Twenty\"],\"yAL7FY\":[\"Create custom apps\"],\"20ZdFp\":[\"Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics.\"],\"YxktRb\":[\"Create fields and edit field widgets more directly from record pages.\"],\"RRfcjH\":[\"Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities.\"],\"qCRCtk\":[\"Create more flexible relationships between objects, including more advanced many-to-many setups.\"],\"oS1RiS\":[\"Create tasks from records\"],\"D3S5+x\":[\"Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context.\"],\"egTba/\":[\"Created By\"],\"ppNnWO\":[\"Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields.\"],\"NLgmM4\":[\"CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection\"],\"Y44Xsf\":[\"CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again.\"],\"wDasLa\":[\"CRM Engineer\"],\"DqkzNV\":[\"CRM Engineer, AC&T Education Migration\"],\"b7vNti\":[\"CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy.\"],\"ntHvtU\":[\"CRM was a ledger. *AI turned it into an operating system.*\"],\"OACAVp\":[\"Croatia 🇭🇷\"],\"I6FFSA\":[\"CSV export anytime\"],\"8RWevB\":[\"CSV import & export\"],\"s+QiQi\":[\"CSV import flow\"],\"zyTj4q\":[\"CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports.\"],\"O2UtEV\":[\"Cuba 🇨🇺\"],\"auudI+\":[\"Currency Field\"],\"lh6aPn\":[\"Custom AI models\"],\"OaTurC\":[\"Custom apps\"],\"TcUCTv\":[\"Custom Apps · Scripts · AI/agent integrations\"],\"onPW5H\":[\"Custom date formats\"],\"yBSEtR\":[\"Custom deal stages for your process\"],\"L+b7SB\":[\"Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality.\"],\"DUnke3\":[\"Custom Development\"],\"GAD3Dx\":[\"Custom domain\"],\"Vz1Vq2\":[\"Custom domain (crm.yourco.com)\"],\"oPwQt4\":[\"Custom fields\"],\"U1RB/7\":[\"Custom fields and relationships\"],\"WGKb6T\":[\"Custom fields, relationships, and a unified timeline for every contact and company in your workspace.\"],\"prIqWa\":[\"Custom layout\"],\"RuYs9T\":[\"Custom layouts\"],\"8skTDV\":[\"Custom objects\"],\"y5pLQH\":[\"Custom sidebar\"],\"AbyZbl\":[\"Custom views\"],\"5xK1jE\":[\"Customer stories\"],\"YjXLAQ\":[\"Customer Stories\"],\"BavWCk\":[\"Customer stories preview\"],\"0fgCyk\":[\"Customer story\"],\"zKLqOg\":[\"Customer story not found — Twenty\"],\"NihQNk\":[\"Customers\"],\"qqLY+j\":[\"Customization\"],\"GRfLAg\":[\"Customizations\"],\"dy0yuR\":[\"Customize your sub-domain\"],\"Pj5fGG\":[\"Cyprus 🇨🇾\"],\"w9VTXG\":[\"Czech\"],\"xkuHM6\":[\"Czech Republic 🇨🇿\"],\"4RLD4p\":[\"Daily messages\"],\"Fo2vDn\":[\"Danish\"],\"aebTao\":[\"Dashboards in Labs (Beta)\"],\"V0kvgB\":[\"Data import\"],\"5cNMFz\":[\"Data model\"],\"ZEsvS2\":[\"Data Model Diagram\"],\"iq2WTm\":[\"Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations\"],\"dSuMNg\":[\"Datetime Field\"],\"/TlpVf\":[\"Deals that move themselves.\"],\"H1UtjM\":[\"Denmark 🇩🇰\"],\"tqbpyT\":[\"Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting.\"],\"X5B6sd\":[\"Dev teams power company-wide *change with Twenty*\"],\"n+SX4g\":[\"Developers\"],\"5atXgh\":[\"Developers can now take advantage of the new array field type to store non-predefined values.\"],\"canH5K\":[\"Developers can now use webhooks to synchronize customer data updates in real-time across applications.\"],\"ohFj56\":[\"Differentiation now *lives in the code you own.*\"],\"Wuqvfz\":[\"Director of Digital and Information, Elevate Consulting\"],\"gW1L7t\":[\"Director, W3villa Technologies, Partner\"],\"30qcNY\":[\"Discord (opens in new tab)\"],\"old0Lj\":[\"Discover the newest features and improvements in Twenty, the #1 Open Source CRM.\"],\"W+b/DF\":[\"Discover what's new\"],\"rHLwDO\":[\"Djibouti 🇩🇯\"],\"Zjjbne\":[\"Do I need a developer to customize Twenty?\"],\"Zx22Ih\":[\"Does Twenty work with Claude, ChatGPT, and Cursor?\"],\"bMDnQR\":[\"Dominica 🇩🇲\"],\"ufcRA6\":[\"Dominican Republic 🇩🇴\"],\"pOLPPB\":[\"Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling.\"],\"HDR0en\":[\"DR Congo 🇨🇩\"],\"mzedFr\":[\"Draft a workflow for an email sequence\"],\"q7M3jo\":[\"Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works.\"],\"fPma12\":[\"Drag-and-drop deals between stages\"],\"KIjvtr\":[\"Dutch\"],\"6r6pDf\":[\"e.g. React, Postgres, n8n…\"],\"a35sCN\":[\"Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain.\"],\"s+5p5k\":[\"Easier field editing\"],\"nKXMzJ\":[\"Easier layouts\"],\"hEtClO\":[\"Ecuador 🇪🇨\"],\"4CJ4xV\":[\"EdTech\"],\"aqxYLv\":[\"Education\"],\"OAdXUT\":[\"Egypt 🇪🇬\"],\"2xK+An\":[\"El Salvador 🇸🇻\"],\"1wTjWx\":[\"Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth.\"],\"2THY70\":[\"Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data.\"],\"wiTeYI\":[\"Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs.\"],\"FNyrb0\":[\"Email & Calendar\"],\"jTgK6B\":[\"Email and calendar Blocklist\"],\"AoN898\":[\"Email and Chat\"],\"rc8HEz\":[\"Email replies\"],\"ObCvfI\":[\"Email sharing\"],\"7o9obN\":[\"Email thread widgets and an inline reply composer make it easier to work directly from messaging records.\"],\"hfqiVr\":[\"Email/calendar activity on each record\"],\"XGd8Wo\":[\"Emails & Calendar\"],\"o4/9l1\":[\"Emails and events linked to CRM records\"],\"QOINDn\":[\"empty\"],\"ZxDrUL\":[\"Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!\"],\"jkaFcU\":[\"Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in.\"],\"Qpn/bX\":[\"Encrypt your data\"],\"Iy8Gze\":[\"Encryption key rotation\"],\"lYGfRP\":[\"English\"],\"pNNVhg\":[\"Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication.\"],\"kZ17+i\":[\"Enhance your data handling capabilities with the addition of four new field types:\"],\"CVqFAV\":[\"Enhanced Kanban Board\"],\"LKTMHa\":[\"Enhanced One-to-Many Relations Editing\"],\"ovz6sZ\":[\"Enhanced Timeline\"],\"Ijh+h+\":[\"Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins.\"],\"xoqD/n\":[\"Enter a valid email address.\"],\"/OVUD6\":[\"Enter a valid URL (starting with http:// or https://).\"],\"87BcPj\":[\"Enterprise *activation*\"],\"NTskGY\":[\"Enterprise Activation | Twenty\"],\"3dQ6zJ\":[\"Environments\"],\"c0nqfC\":[\"Equatorial Guinea 🇬🇶\"],\"4DIpFY\":[\"Eritrea 🇪🇷\"],\"JIhNLR\":[\"Estonia 🇪🇪\"],\"8yXuJ9\":[\"Eswatini 🇸🇿\"],\"rktGGp\":[\"Ethiopia 🇪🇹\"],\"rQqP1P\":[\"Europe\"],\"IhKZhp\":[\"Even the training material is a feature worth celebrating.\"],\"sQP1sF\":[\"Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most.\"],\"rkZTD7\":[\"Every thread, on the right record.\"],\"kz/8m8\":[\"Everything in Pro\"],\"zoNk7e\":[\"Everything updates in real time, with AI chat always ready to help you move faster.\"],\"/g9UKY\":[\"Everything you need, *out of the box*\"],\"2NGXKo\":[\"Expanded support for 30+ languages, so users can navigate and use the software in their preferred language.\"],\"14xdUh\":[\"Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization.\"],\"57gG1f\":[\"Experience enterprise-grade granularity, starting with an 11th permission.\"],\"uZRQi+\":[\"Expertise & experience\"],\"JTM5zS\":[\"Explore customer stories\"],\"weFouS\":[\"Extended run!\"],\"tX4pRm\":[\"Failed to activate enterprise key. Please try again.\"],\"akLvep\":[\"Familiar, modern interface\"],\"gKNP7S\":[\"Farsi\"],\"abO45l\":[\"Fast path to action\"],\"idFRAo\":[\"Faster field setup\"],\"3qy0z4\":[\"Favorites now live in the navigation menu, making the sidebar easier to organize and customize.\"],\"JrTb6F\":[\"Favorites Views and Favorites Folders\"],\"+LREeu\":[\"feature\"],\"hXRm6J\":[\"Field Level Permission\"],\"3Y3//3\":[\"Field widgets\"],\"QDxnW/\":[\"Field widgets are easier to configure directly from the page where you use them.\"],\"5SV9rS\":[\"Field widgets now support more relation types, so custom layouts work better across more objects.\"],\"e6BgMV\":[\"Field-level permissions\"],\"z+q1Th\":[\"Fiji 🇫🇯\"],\"sER+bs\":[\"Files\"],\"jxbpA9\":[\"Files in records\"],\"1t0xRH\":[\"Filter by Multi-Select\"],\"bOidm7\":[\"Filter partners\"],\"kUUNrw\":[\"Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company.\"],\"iabLgo\":[\"Filtered metrics from any object\"],\"sRUAXp\":[\"Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us.\"],\"TJ7HQl\":[\"Find a partner\"],\"MD032e\":[\"Find a Twenty partner\"],\"S6CEQ9\":[\"Find a Twenty Partner — Open Source CRM Marketplace\"],\"wHyJkT\":[\"Find the right partner to implement, customize, and tailor Twenty to your team.\"],\"5asqas\":[\"Find your *Twenty partner*\"],\"9V48qi\":[\"Finland 🇫🇮\"],\"USZ2N6\":[\"Finnish\"],\"PHM5wp\":[\"Flexibility\"],\"YsFkku\":[\"Flexible relations\"],\"HBJ0P5\":[\"Flow\\norchestration\"],\"obrJBN\":[\"Fly through your workspace with shortcuts and short load times.\"],\"HjFq2b\":[\"Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute.\"],\"mjIRMF\":[\"Focus on the use case, not the *plumbing*\"],\"P5E+kT\":[\"Focus on the use case, not the plumbing\"],\"wdVyxi\":[\"Folder/Label import\"],\"qwJuVW\":[\"Footer\"],\"CKQ0za\":[\"For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation.\"],\"yAJC9c\":[\"For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it.\"],\"UCoxP5\":[\"Founder, Nine Dots Ventures\"],\"IPaRlc\":[\"Founder, Wintactix\"],\"671GY5\":[\"France 🇫🇷\"],\"tUgSXd\":[\"Free for you!\"],\"nLC6tu\":[\"French\"],\"weRlb1\":[\"from \",[\"minBudget\"]],\"Iuxc00\":[\"From CSV to CRM in minutes.\"],\"Mxpask\":[\"From documents to *open APIs*\"],\"emeKZ7\":[\"From documents to open APIs\"],\"2CtZ6T\":[\"From Salesforce to\\n*self-hosted Twenty*\"],\"kl+hEJ\":[\"From Salesforce to self-hosted Twenty\"],\"syU/BD\":[\"From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners\"],\"UfoVki\":[\"From simple to *advanced*\"],\"Lf7cb3\":[\"From simple to advanced\"],\"m1I5TY\":[\"Full communication history in one place\"],\"wXgKOm\":[\"Full customization\"],\"YZ7Q3Z\":[\"Full ownership\"],\"hdxwWi\":[\"Fully customizable\"],\"//hrfs\":[\"Gabon 🇬🇦\"],\"yau9J6\":[\"Gambia 🇬🇲\"],\"S84RWl\":[\"Generate tasks for my top 10 accounts\"],\"GOmD9p\":[\"Georgia 🇬🇪\"],\"DDcvSo\":[\"German\"],\"XcPIuI\":[\"Germany 🇩🇪\"],\"ZDIydz\":[\"Get started\"],\"xyKSqi\":[\"Ghana 🇬🇭\"],\"3QRTgQ\":[\"GitHub (opens in new tab)\"],\"wuH0g5\":[\"Gmail integration\"],\"n8waaJ\":[\"Go the extra mile *with no-code*\"],\"Ay/vbT\":[\"Good choice!\"],\"opD7oA\":[\"Google Calendar Integration\"],\"Zh0acB\":[\"Grab 30 minutes so we can get to know your team.\"],\"1W3PAd\":[\"Granular Email Folder Sync\"],\"+tDN2S\":[\"Greece 🇬🇷\"],\"CZXzs4\":[\"Greek\"],\"DDgHcm\":[\"Grenada 🇬🇩\"],\"MCLWq4\":[\"Grow with a flexible foundation\"],\"M/8CC1\":[\"Guatemala 🇬🇹\"],\"UZbq7J\":[\"Guinea 🇬🇳\"],\"vtpxPx\":[\"Guinea-Bissau 🇬🇼\"],\"GT8Ua2\":[\"Guyana 🇬🇾\"],\"5BLiJj\":[\"Haiti 🇭🇹\"],\"Xf5EJg\":[\"Halftone generator\"],\"DHC85F\":[\"Halftone Generator | Twenty\"],\"c3XJ18\":[\"Help\"],\"CRzGla\":[\"Help center\"],\"LiWOgh\":[\"Hey, I'm interested in meeting. Here's my project:\"],\"EhWatX\":[\"Hide changes\"],\"tGjibo\":[\"Hindi\"],\"qfSbUb\":[\"His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix.\"],\"i0qMbr\":[\"Home\"],\"CtU7yU\":[\"Homeseller\"],\"KYnPnU\":[\"Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together.\"],\"v6cmMq\":[\"Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time.\"],\"xaIV9m\":[\"Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty\"],\"zbfmqm\":[\"Honduras 🇭🇳\"],\"mqX9AX\":[\"Hosting & Infrastructure\"],\"SHZNBm\":[\"Hourly\"],\"Ivq5+7\":[\"Hourly rate\"],\"XnFo3G\":[\"How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership.\"],\"PYi0f6\":[\"How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership.\"],\"+MLOVo\":[\"How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack.\"],\"OIwpKt\":[\"How long does it take to get started?\"],\"iRzy9e\":[\"How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows.\"],\"NZYA4S\":[\"How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day.\"],\"5sWcC0\":[\"How teams\\n*built with Twenty*\"],\"Z3Cabh\":[\"How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy.\"],\"URQPvK\":[\"How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone.\"],\"htrFcw\":[\"Hungary 🇭🇺\"],\"T6wyby\":[\"I'll book later →\"],\"RYDa0v\":[\"Iceland 🇮🇸\"],\"ePYQjq\":[\"Identity\"],\"Grur3I\":[\"IMAP\"],\"l0JGUk\":[\"Impersonate users\"],\"N4OVNn\":[\"Implementation\"],\"yHueLx\":[\"Implementation partners\"],\"9P1c4k\":[\"Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched.\"],\"WxaeWx\":[\"Import Relations\"],\"BHNxPe\":[\"Import V2\"],\"ZAKTS6\":[\"Import your data with field mapping, including relations. Export anytime — your data is always yours.\"],\"cCwGqi\":[\"Improved Onboarding Experience\"],\"86Q2Qb\":[\"Improved Performance\"],\"InyU0Z\":[\"In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect.\"],\"d1Aru8\":[\"In production.\"],\"Sqb+jp\":[\"In-app preview for supported file types (when enabled)\"],\"3XP8Lk\":[\"Included!\"],\"/c4yUr\":[\"India 🇮🇳\"],\"iEJqDi\":[\"Indonesia 🇮🇩\"],\"BQukYF\":[\"Indonesian\"],\"S8gy7K\":[\"Industry\"],\"MeL8SS\":[\"Infinite scroll\"],\"+mOisw\":[\"Infinite scroll is still coming soon, unlike the invoice.\"],\"K8iwJx\":[\"Install shared tarball app\"],\"AHWM9N\":[\"Integration\"],\"OChKCc\":[\"Interactive halftone generator exported from Twenty.\"],\"+83cJG\":[\"Interested in meeting \",[\"partnerName\"]],\"MAqMna\":[\"Internal Email Privacy\"],\"0ysJ3C\":[\"Internal team emails won't sync, protecting privacy by preventing access to internal discussions.\"],\"a+PGuG\":[\"Internet accounts per user\"],\"87rKhU\":[\"Introduced a \\\"Data Model Diagram\\\" feature that allows users to visualize the relationships between different objects within the CRM.\"],\"vJncsm\":[\"Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis.\"],\"TR1ici\":[\"Introduced a new design for notifications featuring lighter colors.\"],\"5G37wD\":[\"Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today.\"],\"5BnBV4\":[\"Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!\"],\"KBwqIW\":[\"Invite roles\"],\"FtgjCv\":[\"Iran 🇮🇷\"],\"8yynyz\":[\"Iraq 🇮🇶\"],\"s7XmoY\":[\"Ireland 🇮🇪\"],\"/yQIKP\":[\"Is Twenty really open-source?\"],\"SdtpDP\":[\"Israel 🇮🇱\"],\"QjEULz\":[\"It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other.\"],\"FJ51pP\":[\"It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not.\"],\"kqIAbN\":[\"It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck.\"],\"ltNDOB\":[\"It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden.\"],\"Lj7sBL\":[\"Italian\"],\"OSTD8d\":[\"Italy 🇮🇹\"],\"0BTIQi\":[\"Ivory Coast 🇨🇮\"],\"W6o2Pv\":[\"Jamaica 🇯🇲\"],\"kpk6mj\":[\"Japan 🇯🇵\"],\"dFtidv\":[\"Japanese\"],\"Lsf2+K\":[\"Join our ecosystem and help businesses take control of their customer data with open-source primitives.\"],\"1qiriB\":[\"Join our growing partner ecosystem\"],\"VQIurp\":[\"Join our partner ecosystem and help businesses take control of their CRM.\"],\"m/pXki\":[\"Join the teams that chose to own their CRM. Start building with Twenty today.\"],\"QbxNys\":[\"Jordan 🇯🇴\"],\"VnZMnC\":[\"JSON Field\"],\"pB76mP\":[\"Jul 2025\"],\"hvwlu3\":[\"Jun 2025\"],\"qrYDGE\":[\"Justin Beadle\"],\"vYXuJI\":[\"Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions.\"],\"E6Oohx\":[\"Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it.\"],\"3LDjR0\":[\"Kanbans on any object\"],\"r1cFAW\":[\"Kazakhstan 🇰🇿\"],\"kEahsE\":[\"Kenya 🇰🇪\"],\"TLanjj\":[\"kept\"],\"IxBSi8\":[\"Kiribati 🇰🇮\"],\"h6S9Yz\":[\"Korean\"],\"PqhUrP\":[\"Kosovo 🇽🇰\"],\"3+TwF3\":[\"Kuwait 🇰🇼\"],\"e9zZkH\":[\"Kyrgyzstan 🇰🇬\"],\"8QgJZb\":[\"Labs\"],\"GAmD3h\":[\"Languages\"],\"u6jooT\":[\"Languages spoken\"],\"YHacTY\":[\"Laos 🇱🇦\"],\"2lrGbG\":[\"LATAM\"],\"WvrtRi\":[\"Latest\\n*Releases*\"],\"7OHfcc\":[\"Latvia 🇱🇻\"],\"rdU729\":[\"Layout\"],\"+Ss/og\":[\"Learn how to use Twenty\"],\"wB0DGn\":[\"Lebanon 🇱🇧\"],\"vifyyw\":[\"Legal\"],\"UqdHpG\":[\"Lesotho 🇱🇸\"],\"rJargy\":[\"Liberia 🇱🇷\"],\"Lzw0kM\":[\"Libya 🇱🇾\"],\"tHFTlp\":[\"Licensee:\"],\"K41WYc\":[\"Liechtenstein 🇱🇮\"],\"ESTOTK\":[\"Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content.\"],\"kvxPie\":[\"Link field\"],\"gggTBm\":[\"LinkedIn\"],\"3hSKC5\":[\"LinkedIn (opens in new tab)\"],\"Gg69LR\":[\"LinkedIn URL\"],\"2WIZYd\":[\"Lithuania 🇱🇹\"],\"AHVzME\":[\"Live data and AI built\"],\"GObQuL\":[\"Live updates\"],\"zmRZwk\":[\"Live updates are unavailable, which is almost more honest.\"],\"ObPscj\":[\"Loading activation…\"],\"Oyf4mg\":[\"Loading form…\"],\"Pwqkdw\":[\"Loading…\"],\"7VBQ2j\":[\"Local, Production\"],\"JO8Bdx\":[\"Lock-in\"],\"sQia9P\":[\"Log in\"],\"KPLAuI\":[\"Lower CRM cost\"],\"J13skq\":[\"Luxembourg 🇱🇺\"],\"nRYQC8\":[\"Madagascar 🇲🇬\"],\"/hmUGb\":[\"Maintenance mode\"],\"BNd15Z\":[\"Make your GTM team happy with *a CRM they'll love*\"],\"qHvKxh\":[\"Malawi 🇲🇼\"],\"tF97tn\":[\"Malay\"],\"DIOh5g\":[\"Malaysia 🇲🇾\"],\"62/ScF\":[\"Maldives 🇲🇻\"],\"wc5E/3\":[\"Mali 🇲🇱\"],\"04fjhR\":[\"Malta 🇲🇹\"],\"Si4WyF\":[\"Management Consulting\"],\"TMZPkv\":[\"Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run.\"],\"poX06f\":[\"Manual work at core\"],\"VJOKPB\":[\"Maps view\"],\"Zt5PUS\":[\"Marketplace\"],\"2jVbnO\":[\"Marshall Islands 🇲🇭\"],\"bJNKJ1\":[\"Master every corner of Twenty\"],\"HG/EUg\":[\"Mauritania 🇲🇷\"],\"YDiaY/\":[\"Mauritius 🇲🇺\"],\"Zw+Zv+\":[\"MCP server\"],\"bwCiCi\":[\"Meet the certified agencies and consultants implementing Twenty for teams worldwide.\"],\"ujYZ+f\":[\"Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks.\"],\"CQ9M36\":[\"MENA\"],\"+9RIKB\":[\"Merge Records\"],\"briyJf\":[\"Metrics you can actually trust.\"],\"YBLFQZ\":[\"Mexico 🇲🇽\"],\"KBirDR\":[\"Micronesia 🇫🇲\"],\"YeVpda\":[\"Microsoft o365 Integration\"],\"so04x6\":[\"Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it.\"],\"izddzp\":[\"Mike Babiy\"],\"3TSz9S\":[\"Minimize\"],\"FFFENV\":[\"Minimum project budget\"],\"179i38\":[\"Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place.\"],\"6m8rMT\":[\"Moldova 🇲🇩\"],\"qRRmSe\":[\"Monaco 🇲🇨\"],\"G+EV+A\":[\"Mongolia 🇲🇳\"],\"9VDoNp\":[\"Montenegro 🇲🇪\"],\"+8Nek/\":[\"Monthly\"],\"paxFAm\":[\"More field relations\"],\"kHdAOE\":[\"More Field Types, More Power\"],\"VqXuUv\":[\"More options available!\"],\"AZrhlt\":[\"More powerful search\"],\"LAFO4Y\":[\"Morocco 🇲🇦\"],\"E4h9+U\":[\"Morph Many Relationships\"],\"EwJDrS\":[\"Mozambique 🇲🇿\"],\"dlKkNL\":[\"Multi-file upload on records\"],\"4nwdYp\":[\"Multi-Record Workflow Triggers\"],\"S5w2Q/\":[\"Multi-Select Field\"],\"Gorywi\":[\"Multi-Workspace\"],\"QGWbbv\":[\"Myanmar 🇲🇲\"],\"6YtxFj\":[\"Name\"],\"yYmxee\":[\"Namibia 🇳🇦\"],\"zVOV14\":[\"Nauru 🇳🇷\"],\"Akl9+2\":[\"Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \\\"Close\\\" button.\"],\"TizFpt\":[\"Navigation menu\"],\"LfNsfa\":[\"Need a quick change? Skip the engineering ticket. Customize your workspace in minutes.\"],\"4sbgPq\":[\"Need help with customization?\"],\"LNVNNE\":[\"Nepal 🇳🇵\"],\"g60EgR\":[\"Netherlands 🇳🇱\"],\"8Cp4Of\":[\"NetZero\"],\"J8ZssL\":[\"NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems.\"],\"7HVBV+\":[\"NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows.\"],\"3PtYTO\":[\"NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation.\"],\"zgjuZq\":[\"New Array field type\"],\"cU1+gU\":[\"New record page\"],\"pAKqTG\":[\"New Settings layout\"],\"a54odP\":[\"New Side Panel\"],\"/DTtCF\":[\"New Zealand 🇳🇿\"],\"GY6uSc\":[\"Next →\"],\"KqojOL\":[\"Next steps\"],\"awYrJD\":[\"Next testimonial\"],\"iBOZv7\":[\"Nicaragua 🇳🇮\"],\"61NU7V\":[\"Niger 🇳🇪\"],\"+2NLII\":[\"Nigeria 🇳🇬\"],\"qZ+egR\":[\"Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations.\"],\"sGuHDu\":[\"Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day.\"],\"G0GGKA\":[\"Nine Dots Ventures\"],\"1UzENP\":[\"No\"],\"6tRXQ4\":[\"No matching country.\"],\"1hNHaC\":[\"No more renting someone else's *structure*\"],\"LmWdm6\":[\"No more renting someone else's structure\"],\"UxK4so\":[\"No partners match your filters\"],\"nDjC8E\":[\"No session ID provided. Please complete the checkout first.\"],\"q9f4Tp\":[\"No-code\"],\"SiZ/7E\":[\"No. Build custom objects, fields, views, and no-code workflows straight from Settings. Unlimited, no extra charge.\"],\"096JXI\":[\"North Korea 🇰🇵\"],\"IwF7aJ\":[\"North Macedonia 🇲🇰\"],\"sZwk4U\":[\"Norway 🇳🇴\"],\"1IipHp\":[\"Norwegian\"],\"YfzRVa\":[\"Notes and Tasks standard objects\"],\"iDNBZe\":[\"Notifications\"],\"k3T2mM\":[\"Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you.\"],\"CzeIij\":[\"Number of dashboards\"],\"pkrZnO\":[\"Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first.\"],\"l/1LQc\":[\"Olivier Reinaud\"],\"BdShAR\":[\"Oman 🇴🇲\"],\"D2b+1q\":[\"On a single CRM\"],\"w5ATz2\":[\"On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones.\"],\"XhXmzW\":[\"On this page\"],\"jxC7HY\":[\"Onboarding · Documentation · Change management · L1/L2 support · Managed services\"],\"pbmZ7R\":[\"Onboarding Packs\"],\"37OSdM\":[\"One *API* to rule them all\"],\"Zt1UZb\":[\"One API to rule them all\"],\"pShqss\":[\"Only $5 for SSO. Practically a charity program.\"],\"GSr0rF\":[\"Open menu\"],\"pkXQA+\":[\"Open your Twenty self-hosted instance Settings → Enterprise.\"],\"5RkmVr\":[\"Open-source, AI-ready, and yours to shape.\"],\"ucgZ0o\":[\"Organization\"],\"nDTfhz\":[\"Other improvements\"],\"3PlK59\":[\"Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden.\"],\"dKGg8T\":[\"Out of stock\"],\"PASC/7\":[\"Outlived every redesign since 2004.\"],\"Bwsi7B\":[\"Own your CRM end to end\"],\"oDAEQq\":[\"Ownership\"],\"NmF/Vo\":[\"Owning your stack remains mysteriously out of stock.\"],\"h/oMMb\":[\"Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform.\"],\"+AiiMt\":[\"Pagination builds character.\"],\"sW3DaS\":[\"Pakistan 🇵🇰\"],\"cvRU36\":[\"Palau 🇵🇼\"],\"u2htNd\":[\"Palestine 🇵🇸\"],\"pWLp16\":[\"Panama 🇵🇦\"],\"xOR4tu\":[\"Papua New Guinea 🇵🇬\"],\"kb3PhK\":[\"Paraguay 🇵🇾\"],\"cLitIC\":[\"Partner application\"],\"mYGIvm\":[\"Partner facts and contact\"],\"4RPECg\":[\"Partner not found — Twenty Partners\"],\"dRIK0d\":[\"Partner testimonials\"],\"mPkInZ\":[\"Partners\"],\"9yo8NN\":[\"Paste the key and click Activate.\"],\"TMErUt\":[\"Percentage in number fields\"],\"v1i9+n\":[\"Performance Improvements\"],\"JjOHl8\":[\"Permissions V1\"],\"kJQ+gL\":[\"Permissions V2\"],\"OzAIDr\":[\"Peru 🇵🇪\"],\"LqRs8D\":[\"Philippines 🇵🇭\"],\"we6gj5\":[\"Pick every category that applies.\"],\"KEEuJt\":[\"Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client.\"],\"FFkjaT\":[\"Pipeline Management\"],\"gzkkC3\":[\"Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use.\"],\"z7gnI9\":[\"Please complete all required fields before continuing.\"],\"AFr2a5\":[\"Poland 🇵🇱\"],\"trnWaw\":[\"Polish\"],\"/LAeug\":[\"Portrait of \",[\"authorName\"]],\"8BrmUs\":[\"Portugal 🇵🇹\"],\"MOERNx\":[\"Portuguese\"],\"z87IFG\":[\"Press Enter or comma to add a skill.\"],\"LZoO8F\":[\"Previous testimonial\"],\"a7u1N9\":[\"Price\"],\"aHCEmh\":[\"Pricing\"],\"T/R+Qz\":[\"Primary\"],\"J2IAmT\":[\"Principal and Founder\"],\"kXBQYM\":[\"Principal and Founder, Alternative Partners\"],\"k62X/2\":[\"Priority support\"],\"LcET2C\":[\"Privacy Policy\"],\"DJ3uVe\":[\"Privacy Policy | Twenty\"],\"3fPjUY\":[\"Pro\"],\"K47k8R\":[\"Product\"],\"kIGKva\":[\"Production grade quality\"],\"vERlcd\":[\"Profile\"],\"CcK9cq\":[\"Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around.\"],\"PaHxQd\":[\"Project minimum\"],\"9NAqO4\":[\"Proposal automation\"],\"a24q7E\":[\"Proprietary languages, slow deployment cycles, and \\\"black box\\\" logic.\"],\"u9RZ7+\":[\"Punjabi\"],\"frfCYp\":[\"Q1 2026\"],\"tFx+ES\":[\"Qatar 🇶🇦\"],\"OialmJ\":[\"Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input.\"],\"3XOwjg\":[\"Rates\"],\"zXRspj\":[\"Rating field\"],\"DnWJal\":[\"Reach out\"],\"gSQVmr\":[\"Read the case\"],\"EqCbT9\":[\"Read/Edit/Delete permissions\"],\"/6qiAz\":[\"Ready to build\\n*your own story?*\"],\"TqQ08B\":[\"Ready to grow\\n*with Twenty?*\"],\"zTY2by\":[\"Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit.\"],\"NIwjHh\":[\"Real Estate\"],\"CH+Ona\":[\"Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth.\"],\"5O1eTm\":[\"Real-time changes? That will be a premium surprise.\"],\"4hc7hc\":[\"Real-time data\"],\"dKQCrj\":[\"Real-time is a state of mind, not a feature.\"],\"P7gVBH\":[\"Record is created or updated trigger\"],\"Zhiuz9\":[\"Record quarter\"],\"PWlTvh\":[\"Records\"],\"q45OlW\":[\"Regions\"],\"GtQZI0\":[\"Relation Fields on Record Page\"],\"plY6Rp\":[\"Relations on Record Pages\"],\"rwWjWg\":[\"Release Notes\"],\"5icoS1\":[\"Releases\"],\"BkBq/5\":[\"Remove \",[\"0\"],\" filter\"],\"OY7BZk\":[\"Remove \",[\"skill\"]],\"a/aGHe\":[\"Rename, download, and delete attachments\"],\"t9yxlZ\":[\"Reports\"],\"SY/an2\":[\"Reports & Dashboards\"],\"TD9BOQ\":[\"Reset conversation\"],\"ZYyPd8\":[\"Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts.\"],\"tpLAlL\":[\"Resize navbar and side panel\"],\"s+MGs7\":[\"Resources\"],\"oC2l7f\":[\"REST & GraphQL API\"],\"kx0s+n\":[\"Results\"],\"2itg0p\":[\"Retro 2015\"],\"H0dEn+\":[\"Return traffic light\"],\"k2x4+M\":[\"Revamp View Options Menu\"],\"7xiRJz\":[\"Revamped Navigation Bar\"],\"lHXjXQ\":[\"Revamped Side Panel\"],\"frqduN\":[\"Rich notes attached to records\"],\"i4ofLR\":[\"Rich text layouts\"],\"/gaSVU\":[\"Roadmap\"],\"mLp5AP\":[\"Romania 🇷🇴\"],\"uJc01W\":[\"Romanian\"],\"Wdh41P\":[\"Row-level permissions\"],\"mRpuWW\":[\"Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks.\"],\"T1ut28\":[\"Russia 🇷🇺\"],\"nji0/X\":[\"Russian\"],\"dw8D3T\":[\"Rwanda 🇷🇼\"],\"niLOap\":[\"Saint Kitts & Nevis 🇰🇳\"],\"zCHzF/\":[\"Saint Lucia 🇱🇨\"],\"Md/8iQ\":[\"Saint Vincent 🇻🇨\"],\"Burn4/\":[\"Salesfarce Add-on Center\"],\"xTfEgV\":[\"Salesfarce Pro\"],\"/UolBB\":[\"Salesforce Classic\"],\"l69E+u\":[\"Salesforce migration\"],\"CADlRK\":[\"Same CRM\"],\"60i6S+\":[\"Same output\"],\"xl2tJ9\":[\"Same results\"],\"w9QWxz\":[\"SAML/OIDC SSO\"],\"R38ZPo\":[\"Samoa 🇼🇸\"],\"fK288K\":[\"San Marino 🇸🇲\"],\"KDcBQd\":[\"São Tomé & Príncipe 🇸🇹\"],\"/BK0Nl\":[\"Saudi Arabia 🇸🇦\"],\"elz5ka\":[\"Saved / month\"],\"h3C5H8\":[\"Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace.\"],\"bifv6N\":[\"Scale\"],\"aI/fdL\":[\"Scale without *breaking operations*\"],\"842ybw\":[\"Scale without breaking operations\"],\"vk6sVR\":[\"Search a country…\"],\"+yNkue\":[\"Search in field pickers and add-column menus makes table and layout customization faster.\"],\"HVOGoW\":[\"Seats limit\"],\"a3LDKx\":[\"Security\"],\"nmVU/t\":[\"See how teams\\nbuild *on Twenty*\"],\"aB+XpI\":[\"See more features\"],\"JDp1bg\":[\"See updates as they happen. Work with your team and agents seamlessly.\"],\"0kgOPB\":[\"See what shipped in \",[\"0\"]],\"02ePaq\":[\"Select \",[\"0\"]],\"wgNoIs\":[\"Select all\"],\"6p/m5q\":[\"Select your country\"],\"sXYD/i\":[\"self\"],\"6JhL+3\":[\"Self-hosted\"],\"QFK/45\":[\"Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring\"],\"42Nf4Y\":[\"Self-hosted *means control*\"],\"zuU9UU\":[\"Self-hosted billing\"],\"5CWy3T\":[\"Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs.\"],\"5WmQ5O\":[\"Self-hosted means control\"],\"WxVgfh\":[\"Self-hosted workspaces can now track usage more cleanly with usage-based billing support.\"],\"GrBvv/\":[\"Self-hosting\"],\"YdhUoe\":[\"Self-hosting, now for rent!\"],\"uVBq8r\":[\"Self-Onboarding\"],\"NaHz2o\":[\"Selfhosting\"],\"pi1oME\":[\"Send message\"],\"D50Vyu\":[\"Senegal 🇸🇳\"],\"eEJlq0\":[\"Serbia 🇷🇸\"],\"62gxWx\":[\"Seychelles 🇸🇨\"],\"3VFzsh\":[\"Ship a product on Twenty\"],\"Ta0ts5\":[\"Show changes\"],\"6lGV3K\":[\"Show less\"],\"RhU4bB\":[\"Showing \",[\"visibleCount\"],\" of \",[\"totalCount\"],\" partners\"],\"I89wN/\":[\"Showing all \",[\"totalCount\"],\" partners\"],\"9k9PMD\":[\"Sidebar items\"],\"yhyNch\":[\"Sierra Leone 🇸🇱\"],\"mA6cL1\":[\"Sign up for Cloud in under a minute and start your 30-day trial. For larger rollouts, our 4-hour Onboarding Packs or certified partners get you live in 1–2 weeks.\"],\"qTFDyz\":[\"Simple\\n*Pricing*\"],\"0eG5g+\":[\"Singapore 🇸🇬\"],\"V9dFwD\":[\"Sitemap\"],\"c+cRP3\":[\"Skeleton Loading\"],\"PCSkw2\":[\"Skills\"],\"t6ComU\":[\"Skip the clunky UX that always comes with custom.\"],\"U7keXg\":[\"Slovakia 🇸🇰\"],\"o1VTTF\":[\"Slovenia 🇸🇮\"],\"1v/aHN\":[\"Smart ⌘K\"],\"bUmSwL\":[\"Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute.\"],\"GUqjZ0\":[\"Social media\"],\"b+F/Ih\":[\"Soft Delete\"],\"L58Ivq\":[\"Soft delete feature added: Deleted records are now hidden from view but recoverable from the \\\"Deleted record\\\" option in any object options menu. No more drama!\"],\"6sKjjx\":[\"Solo\"],\"FX2oa1\":[\"Solo or agency?\"],\"TcZtfs\":[\"Solomon Islands 🇸🇧\"],\"TvdMI3\":[\"Solutioning\"],\"t1E06j\":[\"Somalia 🇸🇴\"],\"AVfp38\":[\"Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons.\"],\"Lllsp+\":[\"Some teammate changes now appear right away, so collaboration feels faster and more up to date.\"],\"B/mYo/\":[\"Source code access\"],\"zHJB/O\":[\"South Africa 🇿🇦\"],\"7MdTKh\":[\"South Korea 🇰🇷\"],\"a4jo+V\":[\"South Sudan 🇸🇸\"],\"Kv3C8d\":[\"Spain 🇪🇸\"],\"65A04M\":[\"Spanish\"],\"00jcbn\":[\"Sri Lanka 🇱🇰\"],\"vnS6Rf\":[\"SSO\"],\"uQl22y\":[\"Standard support\"],\"wxW2Sv\":[\"Start automating at huge scale!\"],\"XO628f\":[\"Start for free\"],\"sBOFB0\":[\"Start your free trial today\\nwithout credit card.\"],\"ThcPyu\":[\"Stay in control with our *open-source software*\"],\"j9c8rb\":[\"Stay in Flow\"],\"GdGiNi\":[\"Step \",[\"current\"],\" of \",[\"total\"]],\"bxgoJR\":[\"Step-by-step guides and playbooks to help your team get the most out of their workspace.\"],\"jKt86V\":[\"Stop fighting custom. *Start building, with Twenty*\"],\"UCLArd\":[\"Stop settling for trade-offs.\"],\"hjgBcp\":[\"Stop Workflow Button\"],\"3QIOGT\":[\"Sub-field Filtering\"],\"eVPr22\":[\"Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field.\"],\"Sv4BSp\":[\"Subdomain (yourco.twenty.com)\"],\"H5/rZQ\":[\"Submit application\"],\"MDqQmP\":[\"Submitting…\"],\"8Z1557\":[\"Sudan 🇸🇩\"],\"XYLcNv\":[\"Support\"],\"Aq66kg\":[\"Suriname 🇸🇷\"],\"Yz+oFV\":[\"Swahili\"],\"6u3kqB\":[\"swap\"],\"b2//Ip\":[\"Sweden 🇸🇪\"],\"UaISq3\":[\"Swedish\"],\"IImT5c\":[\"Switzerland 🇨🇭\"],\"sjuSub\":[\"Syria 🇸🇾\"],\"3w+Aox\":[\"Table, Kanban, Calendar\"],\"ISVD3+\":[\"Tagalog\"],\"9M02G5\":[\"Tailor record pages, menus, and views\"],\"boABlR\":[\"Taiwan 🇹🇼\"],\"XJspRJ\":[\"Tajikistan 🇹🇯\"],\"jYsF4G\":[\"Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time.\"],\"JAKtcG\":[\"Talk to us\"],\"fb427h\":[\"Tamil\"],\"ri1l89\":[\"Tanzania 🇹🇿\"],\"GWMpL3\":[\"Tasks & Activities\"],\"Ye3KKA\":[\"Team up with a Twenty expert\"],\"vsdUaL\":[\"Technical notes\"],\"y+bLyB\":[\"Technical skills\"],\"Hevu8X\":[\"Terminal mode\"],\"mvP/25\":[\"Terms and Conditions\"],\"xowcRf\":[\"Terms of Service\"],\"BEX1RA\":[\"Terms of Service | Twenty\"],\"VUZDlr\":[\"Testimonials\"],\"SUr44j\":[\"Thai\"],\"6t7gpr\":[\"Thailand 🇹🇭\"],\"Pa/Y6/\":[\"Thanks, you're in.\\n*Now book your intro call.*\"],\"FjkPYg\":[\"That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients.\"],\"8S4psU\":[\"That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer.\"],\"zXlFuT\":[\"The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business.\"],\"K1T7Mn\":[\"The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record.\"],\"KzqOXm\":[\"The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \\\"Retail,\\\" \\\"Technology,\\\" and \\\"Finance,\\\" enabling more nuanced segmentation and analysis.\"],\"6wVgAW\":[\"The bet is *paying off*\"],\"NT2bSJ\":[\"The bet is paying off\"],\"Wie492\":[\"The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in.\"],\"2kHqXc\":[\"The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them.\"],\"EYi+kT\":[\"The CRM as a *control hub*\"],\"2sfVd8\":[\"The CRM as a control hub\"],\"XlFsoH\":[\"The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant.\"],\"kCUcnD\":[\"The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed.\"],\"MaHqAc\":[\"The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly.\"],\"Q5iZ9Q\":[\"The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy.\"],\"l0eUFC\":[\"The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever.\"],\"SW9clW\":[\"The future of CRM is built, *not bought.*\"],\"sm10Rg\":[\"The Giant Monolith\"],\"nFB8I1\":[\"The In-house Burden\"],\"ZNzKXV\":[\"The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic.\"],\"nf1NnD\":[\"The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields.\"],\"tADBQB\":[\"The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads.\"],\"q1kKLq\":[\"The opportunity\"],\"80f4ed\":[\"The principles and product philosophy behind the open source CRM.\"],\"2NJdyz\":[\"The Problem.\"],\"GTy93s\":[\"The record page now features a clearer layout with increased space for content\"],\"3/wAFg\":[\"The result\"],\"nAWeyi\":[\"The result is a system that fits how AC&T already worked, instead of the other way around.\"],\"WENmFq\":[\"The right *foundation*\"],\"nbHA9N\":[\"The right foundation\"],\"g8h2v+\":[\"The search feature now includes ranking scores. This helps you find the most relevant results faster.\"],\"9CCRtB\":[\"The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results.\"],\"omVXTg\":[\"The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source.\"],\"1tN3qf\":[\"The shift\"],\"iW6MjB\":[\"The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature.\"],\"AnGOwN\":[\"The situation\"],\"gXGp3Q\":[\"The story behind Twenty\"],\"axo4rg\":[\"The terms governing your use of Twenty and its open source CRM services.\"],\"xCAT8U\":[\"The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events\"],\"u0uFxg\":[\"They are the real sales\"],\"53RXLB\":[\"They call it customer loyalty. We call it a very affectionate cage.\"],\"RhmZMe\":[\"They did not just replace a tool. They took back ownership of how their business runs.\"],\"ZnqwXn\":[\"They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother.\"],\"5YzqyT\":[\"They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control.\"],\"AUV+TY\":[\"Thinking\"],\"8gek0+\":[\"This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate.\"],\"6f8QUY\":[\"Timor-Leste 🇹🇱\"],\"WwTFtc\":[\"To enhance privacy, you can now add specific email addresses to a blocklist within the \\\"Accounts\\\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals.\"],\"ijf9QM\":[\"To maintain the simplicity of Twenty, we are introducing \\\"Advanced Settings.\\\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings.\"],\"DeTupk\":[\"Togo 🇹🇬\"],\"CocxTO\":[\"Tonga 🇹🇴\"],\"5eFktS\":[\"Tool integration\"],\"xv7HSr\":[\"total per month with fixed cost\"],\"hmu++i\":[\"Track amount and close date\"],\"POzmFl\":[\"Track every release with changelogs, highlights and demos of the newest features.\"],\"6vHPh9\":[\"Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence.\"],\"xwWQ9Q\":[\"Training & Adoption\"],\"MtCqjl\":[\"Training, Adoption & Support\"],\"VhVAzf\":[\"Translation in 30+ Languages\"],\"/ga9kq\":[\"Trinidad & Tobago 🇹🇹\"],\"tdZpCd\":[\"Trust Center\"],\"HlusPQ\":[\"Trust the n°1 CRM, *or not!*\"],\"KtyN0b\":[\"trusted by\"],\"QZdPWP\":[\"Trusted by leading organizations\"],\"eslLQF\":[\"Try it live\"],\"qhmtws\":[\"Try removing some filters or browse all partners.\"],\"E/hGy3\":[\"Try Twenty Cloud\"],\"D5Kf4t\":[\"Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours.\"],\"y4UxlS\":[\"Tunisia 🇹🇳\"],\"UIDKnJ\":[\"Turkey 🇹🇷\"],\"Kz91g/\":[\"Turkish\"],\"kdJl4v\":[\"Turkmenistan 🇹🇲\"],\"tSc/a3\":[\"Tuvalu 🇹🇻\"],\"O5dAmW\":[\"Twenty | #1 Open Source CRM\"],\"NalB1c\":[\"Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform.\"],\"fZsVj6\":[\"Twenty as the\\n*API backbone* of a go-to-market stack\"],\"+w9xZW\":[\"Twenty as the API backbone of a go-to-market stack\"],\"zj0CA+\":[\"Twenty as the API backbone of a go-to-market stack | Elevate Consulting\"],\"neM1Ol\":[\"Twenty CRM Features — Modern Open Source CRM Platform\"],\"8zCqPL\":[\"Twenty CRM Pricing — Plans from $9 per User per Month\"],\"D05UQH\":[\"Twenty Customers — How Modern Teams Run Their CRM\"],\"MYHdd/\":[\"Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market.\"],\"fwep/o\":[\"Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it.\"],\"0qyMhk\":[\"Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves.\"],\"jVhq41\":[\"Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform.\"],\"x/I85y\":[\"Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible.\"],\"zvfdHM\":[\"Twenty is the heart of the system. Everything branches from it.\"],\"K+zzSQ\":[\"Twenty lets us build a CRM around the business and not the business around the CRM.\"],\"AxT+g4\":[\"Twenty makes it simple. It's clean, intuitive, and built to feel like Notion.\"],\"mZ3xRm\":[\"Twenty partner ecosystem\"],\"4SJucz\":[\"Twenty Partners — Certified Open Source CRM Implementers\"],\"vD7S1X\":[\"Twenty release \",[\"0\"],\" — \",[\"1\"]],\"X1GHuJ\":[\"Twenty Releases — What's New in the Open Source CRM\"],\"V1lV7B\":[\"Twenty team support\"],\"osa7Xg\":[\"Twenty user guide preview\"],\"KsFvUt\":[\"Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call.\"],\"tuvLv1\":[\"Two Factor Authentication\"],\"EIU345\":[\"Two-factor authentication\"],\"O+vc/1\":[\"Type of team *\"],\"P+R1Lc\":[\"Typical project\"],\"HqFilh\":[\"UAE 🇦🇪\"],\"+WNTxL\":[\"Uganda 🇺🇬\"],\"uxuy4l\":[\"UI theme\"],\"tNfmmF\":[\"UK 🇬🇧\"],\"z7UkhA\":[\"Ukraine 🇺🇦\"],\"V9+2pH\":[\"Ukrainian\"],\"jqzUyM\":[\"Unavailable\"],\"Hix/m6\":[\"Unified timeline (emails, events, tasks, notes, files)\"],\"NIuIk1\":[\"Unlimited\"],\"q7vKOJ\":[\"Unlisted Views\"],\"aGpTSC\":[\"Up to 5 workspaces\"],\"KQsreu\":[\"Updated by\"],\"SPdRRU\":[\"Upfront consulting, scoping, strategy.\"],\"WLb3m4\":[\"Upgraded Search\"],\"2vanwz\":[\"Upload, rename, preview, and manage files directly on records. Everything stays where it belongs.\"],\"tmwuH9\":[\"Urdu\"],\"huOaG8\":[\"Uruguay 🇺🇾\"],\"RCOibx\":[\"US\"],\"LXHEIS\":[\"USA 🇺🇸\"],\"Roaswv\":[\"User Guide\"],\"9iX1i3\":[\"User impersonation\"],\"3XIgKU\":[\"User roles\"],\"UCUX2+\":[\"User-side rollout & ongoing support.\"],\"FOOEtP\":[\"Uzbekistan 🇺🇿\"],\"CRXL2j\":[\"Vanuatu 🇻🇺\"],\"NNeEYO\":[\"Vatican 🇻🇦\"],\"BWzac4\":[\"Venezuela 🇻🇪\"],\"fDWr8s\":[\"Version control\"],\"FlQ1vR\":[\"Vietnam 🇻🇳\"],\"fROFIL\":[\"Vietnamese\"],\"BRBSny\":[\"View \",[\"0\"],\" on LinkedIn\"],\"V4nZs/\":[\"View Groups\"],\"ITdNGt\":[\"View on LinkedIn\"],\"73lp8c\":[\"View profile\"],\"BAzC1v\":[\"View types\"],\"mHtVst\":[\"Visualize your customers on a map!\"],\"CsHuOr\":[\"VP of Engineering\"],\"uRh799\":[\"VP of Engineering at W3villa Technologies\"],\"w2INie\":[\"VP of Engineering, W3villa Technologies\"],\"s0tU5h\":[\"W3Grads\"],\"R8BueT\":[\"W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone.\"],\"7hHsoV\":[\"W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone.\"],\"QBOUnd\":[\"W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing.\"],\"7q5Vjn\":[\"W3villa Technologies\"],\"ZabLEt\":[\"W3villa Technologies set out to solve it properly, not with a workaround, but with a product.\"],\"3v2ipf\":[\"W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves.\"],\"k1Pevc\":[\"We are pleased to reopen the cloud subscription to everyone. No more waiting!\"],\"8CHatv\":[\"We could not submit your application. Please try again in a moment.\"],\"ofRgSN\":[\"We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind.\"],\"MjWeUE\":[\"We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind.\"],\"GVxbgf\":[\"We have improved app performance, shaving off over 500ms on each page.\"],\"6C4xTI\":[\"We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks.\"],\"l7iJRt\":[\"We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV.\"],\"d5CWI6\":[\"We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us.\"],\"DFlq8J\":[\"We’ve added an \\\"any field search\\\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \\\"Mobile,\\\" \\\"Office,\\\" or \\\"Direct Line\\\" field.\"],\"kenNyf\":[\"We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars.\"],\"5CT1rV\":[\"We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!\"],\"xBnjMX\":[\"We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well.\"],\"v1kQyJ\":[\"Webhooks\"],\"ZhnM/K\":[\"Webhooks (Change Data Capture)\"],\"K4G86X\":[\"Webhooks filter\"],\"FaPmsq\":[\"Webhooks multi-object filtering\"],\"hgDePr\":[\"Website or GitHub\"],\"Lx0cVD\":[\"What an admin can do without writing code.\"],\"Z34FQq\":[\"What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company.\"],\"phiBjc\":[\"What does Twenty cost?\"],\"WVQaGB\":[\"What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible.\"],\"iOAq7n\":[\"What is next\"],\"tWd6MT\":[\"What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together.\"],\"kRfFDB\":[\"What they do\"],\"aYRqmz\":[\"What this means\"],\"QCHIzm\":[\"What you cover *\"],\"1kfjxX\":[\"Whatever came next had to be something they could own.\"],\"cs6VpJ\":[\"When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop.\"],\"chISDP\":[\"When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects.\"],\"qqPUvu\":[\"When the channel is *the business*\"],\"JglRo/\":[\"When the channel is the business\"],\"nkkLPM\":[\"When the vendor *pulled the plug*\"],\"DajeYD\":[\"When the vendor pulled the plug\"],\"8SbakK\":[\"When your CRM is\\n*the product*\"],\"OQ41z8\":[\"When your CRM is the product\"],\"Svuneu\":[\"When your CRM is the product: W3Grads on Twenty | W3villa Technologies\"],\"2O07UN\":[\"Where & how\"],\"bGN8u+\":[\"While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty.\"],\"DJlSwA\":[\"Why\"],\"mrxgOV\":[\"Why teams choose Twenty\"],\"4sOVu+\":[\"Why Twenty\"],\"DH7vVZ\":[\"Why Twenty — The Open Source CRM Built to Be Customised\"],\"tetjz4\":[\"Why Twenty illustration\"],\"7KJZ0z\":[\"Window controls\"],\"V+BOYT\":[\"With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control.\"],\"edwOmb\":[\"With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines.\"],\"OKVlnc\":[\"With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket.\"],\"OX5bbs\":[\"Work email *\"],\"5VGHpF\":[\"Workflow branches\"],\"9MLcn+\":[\"Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation.\"],\"XYIks/\":[\"Workflow Bulk Select\"],\"gDMfQI\":[\"Workflow Filters\"],\"aNVMLK\":[\"Workflow improvements\"],\"EnPi2W\":[\"Workflow Iterator Node\"],\"jN2u/p\":[\"Workflow Search Node Limit\"],\"woYYQq\":[\"Workflows\"],\"OteDxj\":[\"Workflows that *actually get used*\"],\"AzqmMJ\":[\"Workflows that actually get used\"],\"pmUArF\":[\"Workspace\"],\"bwECg/\":[\"Workspace URL, customer references, relevant links…\"],\"p3ZD6C\":[\"X (opens in new tab)\"],\"zkWmBh\":[\"Yearly\"],\"S6izIJ\":[\"Yemen 🇾🇪\"],\"l75CjT\":[\"Yes\"],\"bo6pUs\":[\"Yes, with our Apps framework. Scaffold an extension with `npx create-twenty-app` and ship custom objects, server-side logic functions, React components that render inside Twenty’s UI, AI skills and agents, views, and navigation, all in TypeScript, deployable to any workspace.\"],\"yIcBW6\":[\"Yes. Every Cloud workspace ships with a native MCP server. Connect your AI assistant via OAuth and it can read and write your CRM data in natural language.\"],\"8xYMYQ\":[\"Yes. Import your data via CSV, or use our API for 50,000+ records. Our partners can handle the full migration for you.\"],\"8m0eN9\":[\"Yes. Twenty is the #1 Open Source CRM on GitHub. You can self-host to fully own your infrastructure, or run it on our managed cloud for a zero-ops setup.\"],\"Q3GDrw\":[\"You can now add your views to favorites for quick access and organize your favorites into folders for better management.\"],\"wvm+7M\":[\"You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions.\"],\"Wg/o59\":[\"You can now create number fields that display a percentage instead of a regular number.\"],\"BAWUUs\":[\"You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link.\"],\"nbc7CM\":[\"You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)\"],\"dCaNPC\":[\"You can now edit one-to-many relations directly from the \\\"many side\\\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company.\"],\"HX2309\":[\"You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field.\"],\"/eqpqH\":[\"You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created.\"],\"HeaQGk\":[\"You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience.\"],\"l2z97k\":[\"You can now link your Microsoft account to easily manage your messages and events right within your workspace.\"],\"QN6ytb\":[\"You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection.\"],\"pYoGew\":[\"You can now navigate from one object to another directly from the record detail page.\"],\"mpOPSr\":[\"You can now preview file attachments without downloading them.\"],\"PoxYsC\":[\"You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons.\"],\"S4LCu8\":[\"You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content.\"],\"uS4RtA\":[\"You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently\"],\"px+QAM\":[\"You can now see who last updated a record\"],\"OVoVQg\":[\"You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace.\"],\"eheMXY\":[\"You can now trigger workflows when a record is created or updated.\"],\"XEEpNj\":[\"You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object.\"],\"LJ3sTb\":[\"You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter.\"],\"AUzqeZ\":[\"You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows.\"],\"SfJVcK\":[\"Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance.\"],\"krHgj1\":[\"Your enterprise key\"],\"+dxjCu\":[\"Your enterprise license has been activated successfully.\"],\"pEQiCY\":[\"Your name *\"],\"fQATWn\":[\"Your network, fully mapped.\"],\"sgod9b\":[\"Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code.\"],\"CgGN5T\":[\"Zambia 🇿🇲\"],\"wHjFOw\":[\"Zero\"],\"ZvEoMq\":[\"Zero manual work at the core. Full automation. Built on Twenty.\"],\"TT3YXb\":[\"Zimbabwe 🇿🇼\"],\"ACjxWW\":[\"Zoom\"]}")as Messages; \ No newline at end of file diff --git a/packages/twenty-website-redone/src/locales/generated/fr-FR.ts b/packages/twenty-website-redone/src/locales/generated/fr-FR.ts deleted file mode 100644 index 0e6bf33a40..0000000000 --- a/packages/twenty-website-redone/src/locales/generated/fr-FR.ts +++ /dev/null @@ -1 +0,0 @@ -/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"BUIzFF\":[\"-33% off\"],\"AGZHx4\":[\"...with AI that actually helps you *work faster*\"],\"Z6mKXu\":[[\"0\"],\" — Twenty Partner\"],\"sGt3Jm\":[\"Étude de cas \",[\"0\"]],\"jC5JCB\":[[\"count\"],\" Case Studies\"],\"NSO/FI\":[[\"hourly\"],\"/hr\"],\"rAP+km\":[[\"labelText\"],\" filter\"],\"7hlEpj\":[[\"labelText\"],\" filter, \",[\"0\"],\" selected\"],\"0Qb9by\":[\"*150 hours* saved every month\"],\"k3IzYC\":[\"*Zero manual work* at the core\"],\"icND7o\":[\"/ seat / month - billed yearly\"],\"XUqxHW\":[\"/user/month\"],\"UEDohT\":[\"© \",[\"year\"],\" – Twenty\"],\"2ygf/L\":[\"← Back\"],\"9j/bUt\":[\"← Twenty partners\"],\"foGG8A\":[\"+$105/user per month\"],\"Bsq9GJ\":[\"+$35/user per month\"],\"mWSpW5\":[\"+$5/user per month\"],\"JIwDAd\":[\"+$7000/org per month\"],\"yVr18d\":[\"+$75/user per month\\nSwitch to enterprise!\"],\"iK+ikF\":[\"+10k autres\"],\"nRtVCK\":[\"+20% of net spend\\n+$75/user per month\\nSwitch to enterprise!\"],\"BmAWVq\":[\"<0>App Health Check: Added a health check feature to the admin panel. Now shows real-time status and key metrics. <1>Environment Variables: Admin panel now has read-only access to environment variables. Better transparency, easier config management.\"],\"pQcyVv\":[\"<0>Edit Kanban Stages: You can now edit Kanban stages directly from the app, not just from the settings. This makes it easier to manage and customize your workflow on the fly. <1>\\\"No Value\\\" Column: Cards that are not assigned to a specific value will now appear in a \\\"No Value\\\" column. This column can be shown or hidden as needed, ensuring no cards are overlooked.\"],\"cCqojY\":[\"<0>Quick Access to Records: Side panel lets you view and edit records without leaving your current page. <1>Keyboard Navigation: Navigate the side panel with keyboard for better accessibility and faster workflows. <2>Pinned Actions: More actions now displayed directly in the navbar for easier access.\"],\"be30i9\":[\"$0\"],\"6inRXo\":[\"$1/orchestration run/org\\n+$75/user per month\\nSwitch to enterprise!\"],\"EkIZkY\":[\"$19\"],\"8r6DgO\":[\"$9\"],\"EHNAf2\":[\"1 click\"],\"qvNspm\":[\"1‑800‑YES‑SOFTWARE\"],\"6WQdu8\":[\"100 per minute\"],\"uuKUqZ\":[\"11 permissions\\ngroups\"],\"2szX5S\":[\"150\"],\"9ntyY8\":[\"150 hrs\"],\"2z1Znr\":[\"2 years contract\"],\"l6Vx4q\":[\"2,000+\"],\"FKcV/y\":[\"2025\"],\"PJgfBS\":[\"3\"],\"BL47wE\":[\"3 2 years contract\\n-33% off\"],\"/jgC+9\":[\"3 product lines\"],\"7SJhyh\":[\"30+\"],\"Pdl2UE\":[\"4 tools\"],\"2ScEtE\":[\"5 workflow credits/month included\"],\"hIKxCy\":[\"5,000\"],\"Z2TH0F\":[\"50 per minute\"],\"CiRGZ8\":[\"50 workflow credits/year included\"],\"tZvajW\":[\"6 workflows\"],\"fHxYPM\":[\"90%+\"],\"u6Xxdi\":[\"A business that does not fit a *template*\"],\"NLSM5L\":[\"A business that does not fit a template\"],\"SR9TmK\":[\"A CRM for teams that *move fast*\"],\"MXRINg\":[\"A CRM that\\n*grows* with you\"],\"diWAWP\":[\"A CRM that grows with you\"],\"och6cp\":[\"A CRM that grows with you | NetZero & Twenty\"],\"N3qsQD\":[\"A CRM they\\n*actually own*\"],\"muZzEA\":[\"A CRM they actually own\"],\"HSyZ9R\":[\"Un CRM sur mesure donne un avantage à votre organisation, *mais en construire un* implique des *compromis*\"],\"Ll7vsZ\":[\"A demo worth a *thousand words*\"],\"uNIo/j\":[\"A modern CRM with *an intuitive interface*\"],\"sDJ4rX\":[\"A new breadcrumb navigation across the app, improved keyboard menu navigation, and a new focus state for table views.\"],\"aYUQpm\":[\"A new maintenance mode helps admins pause workspace changes during sensitive operations.\"],\"P5BDuh\":[\"A platform ready to *grow*\"],\"rxMguZ\":[\"A platform ready to grow\"],\"vbJW8I\":[\"A real estate agency on WhatsApp built a\\n*CRM* around it\"],\"hwoGni\":[\"A real estate agency on WhatsApp built a CRM around it\"],\"WjUlJr\":[\"A retro theme as a paid add-on is somehow the most believable part.\"],\"r9Msiv\":[\"A year ago, customizing your CRM meant hiring a Salesforce consultant, learning Apex, waiting months. The gap between \\\"I want this\\\" and \\\"it's live\\\" was measured in quarters and invoices. So people settled. They bent their process to fit the tool and called it adoption.\"],\"H1lDvm\":[\"Ability to set User and Admin permissions for each user. Admins can edit workspace settings, while Users can only edit records. Custom permission creation will be available in a future update.\"],\"c0RR2h\":[\"About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together.\"],\"41o3VS\":[\"AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control.\"],\"TuJiQF\":[\"AC&T Education Migration\"],\"yHUdh6\":[\"AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export.\"],\"MPzy5R\":[\"AC&T est passé à une instance Twenty auto-hébergée : aucun risque fournisseur, aucune migration forcée, et des coûts CRM réduits de plus de 90 %.\"],\"J+A83M\":[\"AC&T a remplacé un CRM propriétaire abandonné par Twenty auto-hébergé et réduit ses coûts CRM de plus de 90 %.\"],\"Kqfsda\":[\"Activate your Twenty enterprise license after checkout and copy your key into your self-hosted instance.\"],\"muhZ+X\":[\"Activating your enterprise license…\"],\"+cggij\":[\"Activation failed. Please try again.\"],\"trCWSt\":[\"Activation response was incomplete.\"],\"Yyn/dP\":[\"Active filters\"],\"iNSn2+\":[\"Add files directly to records so documents, screenshots, and other assets stay attached to the right work.\"],\"x0pZJy\":[\"Add filters between workflow steps with conditions and only let data continue if it meets the criteria you define.\"],\"woOp+c\":[\"Add objects and fields\"],\"ZuoQMi\":[\"Add records to filtered views\"],\"l3+wiC\":[\"Add rich text directly inside layouts with the new dedicated field widget.\"],\"ced+/c\":[\"Add Several emails for one contact\"],\"Y2K3rp\":[\"Add-ons\"],\"U4glZw\":[\"Added \\\"Group By\\\" in tables to better organize entries, like grouping companies by industry for clearer data visualization. This feature is available in the table Options menu.\"],\"6u4D5m\":[\"Address Field Type\"],\"g1in8j\":[\"Admin Panel\"],\"Op7nVF\":[\"Adoption\"],\"SUk0w7\":[\"Advanced Email and Calendar Settings\"],\"dePx/O\":[\"Advanced filter enables precise database content filtering through nested conditional operators (AND/OR), multiple field filters, and customizable filter groups for complex query construction.\"],\"c0acMS\":[\"Advanced filters\"],\"JiIKww\":[\"Advanced Settings\"],\"2050Pj\":[\"Advisory & Discovery\"],\"QjSFuI\":[\"Afghanistan 🇦🇫\"],\"StqEz0\":[\"Africa\"],\"NmHsVh\":[\"Agency\"],\"vZKKhf\":[\"Aggregate, bar, line, and pie widgets\"],\"HURF9k\":[\"Aggregates\"],\"rp2omj\":[\"Agribusiness\"],\"jiGK6+\":[\"AI (Einstein)\"],\"aUn7Ps\":[\"AI & Automations\"],\"HbXHSp\":[\"AI agents\"],\"WGXwzu\":[\"AI agents are starting to draft outreach, score leads, research accounts, write follow-ups, update deal stages. Every one of these actions reads from and writes to the CRM. The scoreboard became the playbook. The database became the brain.\"],\"Rsxdfy\":[\"AI Agents with custom skills\"],\"JHi+LN\":[\"AI agents, chats, and MCP\"],\"n2fhCy\":[\"AI chat\"],\"YeA2Ox\":[\"AI Chat is easier to use with a cleaner experience and clearer model choices.\"],\"TfV/y9\":[\"AI chat, settings, and records in a side panels for fast, single-screen access.\"],\"R+bwFB\":[\"L'IA pour des itérations rapides\"],\"svfUwH\":[\"AI in the *migration workflow*\"],\"A6v5aI\":[\"AI in the migration workflow\"],\"t97j+F\":[\"AI-assisted\"],\"7xlBwk\":[\"Albania 🇦🇱\"],\"EszGq4\":[\"Algeria 🇩🇿\"],\"LIGwFL\":[\"Alternative Partners\"],\"GDVvyT\":[\"Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers.\"],\"CCrRuT\":[\"Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work.\"],\"UIu18Y\":[\"Alternative Partners a utilisé l'IA agentique pour compresser des semaines de migration Salesforce en un travail qu'une seule personne pouvait superviser.\"],\"+BHPrF\":[\"always\"],\"iFLhqi\":[\"Amrendra Pratap Singh\"],\"Sbiivs\":[\"Andorra 🇦🇩\"],\"Uv5eaJ\":[\"Angola 🇦🇴\"],\"qKANz3\":[\"Antigua & Barbuda 🇦🇬\"],\"BfeCSx\":[\"Any Field filter\"],\"aGCcXe\":[\"Des questions ?\"],\"lgSvgF\":[\"Anything else we should know?\"],\"pkMjbA\":[\"Anything that needs a developer.\"],\"dYZUP3\":[\"Anything that needs devops skills.\"],\"AfiWqP\":[\"APAC\"],\"/AMVjF\":[\"APEX tutorials\"],\"yKBF3l\":[\"API access\"],\"30KnZB\":[\"API calls\"],\"42FQ3y\":[\"API-first\"],\"azQMHP\":[\"APIs are extra. Simplicity has a price.\"],\"MqJvvH\":[\"APIs, SDKs et webhooks pour étendre Twenty et livrer des applications sur vos données CRM.\"],\"k8I7/G\":[\"Apply to build\\n*the future of CRM*\"],\"LJCDxT\":[\"Apply to join the Twenty partner ecosystem and grow your practice with the #1 open source CRM.\"],\"8HV3WN\":[\"Arabic\"],\"uicv6Z\":[\"Architecture\"],\"fT9xVz\":[\"Argentina 🇦🇷\"],\"3KxGep\":[\"Armenia 🇦🇲\"],\"S+Q+1d\":[\"Ask questions, automate tasks, and get insights with AI that understands your data and helps you move faster every day, end to end across teams.\"],\"7UGCGX\":[\"Assemblez, itérez et adaptez un CRM robuste, *rapide à faire évoluer*\"],\"v7zTZl\":[\"Assign owners and due dates\"],\"awzjg/\":[\"Attachment Visualizer\"],\"fxL/Km\":[\"Attachments without the chaos.\"],\"y2W2Hg\":[\"Audit logs\"],\"tw0/s1\":[\"Australia 🇦🇺\"],\"4cf5s+\":[\"Austria 🇦🇹\"],\"FFv0Vh\":[\"Automation\"],\"SJ7WSP\":[\"Available on YouTube!\"],\"8d+jRc\":[\"Azerbaijan 🇦🇿\"],\"iH8pgl\":[\"Back\"],\"wIoAQo\":[\"Bahamas 🇧🇸\"],\"Rhju1T\":[\"Bahrain 🇧🇭\"],\"LxzgmZ\":[\"Bangladesh 🇧🇩\"],\"rtcPS0\":[\"Barbados 🇧🇧\"],\"RownlY\":[\"Based in\"],\"jQLfIW\":[\"Because apparently privacy feels more premium with a surcharge.\"],\"qEQv1F\":[\"Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform.\"],\"uIG0OH\":[\"Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites.\"],\"JGM+JO\":[\"Because true orchestration means putting a dollar sign on every dramatic entrance.\"],\"Z7U/Og\":[\"Because Twenty's API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected.\"],\"kWm0dC\":[\"Become\\n*our partner*\"],\"PKMHNe\":[\"become a genius!\"],\"6ZCRfT\":[\"Become a partner\"],\"j+1dcz\":[\"Become a Twenty Partner — Apply\"],\"83Wi6G\":[\"Commencez avec des *briques* de niveau production\"],\"0TCnEf\":[\"Belarus 🇧🇾\"],\"qblg4t\":[\"Belgium 🇧🇪\"],\"pSF7xM\":[\"Belize 🇧🇿\"],\"Hds3Bq\":[\"Bengali\"],\"cTWkw3\":[\"Benin 🇧🇯\"],\"SYfuGP\":[\"Benjamin Reynolds\"],\"YfjrMq\":[\"Bertrams\"],\"mzTjnf\":[\"Better than Liquid Glass!\"],\"T1oJwH\":[\"Beyond *internal rollout*\"],\"OPnz/X\":[\"Bhutan 🇧🇹\"],\"8tzR0k\":[\"Billing period\"],\"BpyJwa\":[\"Illustration développeur bleue avec des flèches ramifiées\"],\"TVJDFA\":[\"Bolivia 🇧🇴\"],\"MkvsWx\":[\"Book a call\"],\"Wzdd8u\":[\"Bosnia & Herzegovina 🇧🇦\"],\"wtNsrt\":[\"Botswana 🇧🇼\"],\"yCaNfF\":[\"Brazil 🇧🇷\"],\"bmk2dj\":[\"Browse Twenty's certified partners — the agencies and individuals who migrate, customise, host, and support the open source CRM across regions, languages, and deployment models.\"],\"VX4eI/\":[\"Brunei 🇧🇳\"],\"s4FVHa\":[\"Build a CRM your\\ncompetitors *can't buy.*\"],\"sbr0X/\":[\"Build a dashboard of pipeline by stage\"],\"uetyzD\":[\"Build a pipeline board grouped by stage\"],\"3+uH0v\":[\"Build an app\"],\"Utc5RF\":[\"Build custom dashboards from live CRM data. Aggregate anything — deals, accounts, activity — into charts your team actually reads.\"],\"rdvFK9\":[\"Build it in an afternoon. *AI made the gap that small.*\"],\"e1u+Zh\":[\"Construisez sur une plateforme ouverte\"],\"yEKs3h\":[\"Build with your favorite tools\"],\"2FDUkV\":[\"Construisez votre CRM d'entreprise *à la vitesse de l'IA*\"],\"SoAKmY\":[\"Built for speed\"],\"sdItv6\":[\"Bulgaria 🇧🇬\"],\"Lze0QH\":[\"Bulk Deletion\"],\"dNnRlc\":[\"Burkina Faso 🇧🇫\"],\"j8RGrG\":[\"Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty\"],\"jtdtLa\":[\"Burundi 🇧🇮\"],\"L40Ae7\":[\"Calendar / booking link\"],\"6DqzR/\":[\"Calendar View for Objects\"],\"4yFkf9\":[\"Cambodia 🇰🇭\"],\"AvRzYu\":[\"Cameroon 🇨🇲\"],\"wCALve\":[\"Les développeurs peuvent-ils étendre Twenty avec du code ?\"],\"6mytgb\":[\"Puis-je migrer depuis Salesforce ou HubSpot ?\"],\"nEOTNi\":[\"Canada 🇨🇦\"],\"hRO6uK\":[\"Cape Verde 🇨🇻\"],\"qLBo3s\":[\"carrousel\"],\"C6wh0T\":[\"Case\"],\"M1RLfx\":[\"Catalan\"],\"NUrY9o\":[\"Categories\"],\"dBApoS\":[\"Central African Republic 🇨🇫\"],\"iI3Dq9\":[\"Chad 🇹🇩\"],\"+DEogc\":[\"Changer de langue\"],\"2D9CbR\":[\"Check more add-ons\"],\"2BY3So\":[\"Chile 🇨🇱\"],\"zG6t8U\":[\"China 🇨🇳\"],\"h1IXFK\":[\"Chinese\"],\"s2oWpP\":[\"Choisir une langue\"],\"AZNxzv\":[\"Choose a role directly when inviting a teammate to a workspace.\"],\"geiXTM\":[\"Choose exactly which Gmail labels or Outlook folders to sync on your workspace. This gives you more control over your email data and better privacy by importing only the folders you need.\"],\"TNVfAe\":[\"Choose how to display dates in any field using a universal Unicode date format that best suits your use case.\"],\"3wV73y\":[\"City\"],\"ZbCD7v\":[\"Classic never dies. It just gets extended one more time.\"],\"u8JHrO\":[\"Clear filters\"],\"yz7wBu\":[\"Close\"],\"cu6iol\":[\"Close dialog\"],\"vcpc5o\":[\"Fermer le menu\"],\"oLsrmd\":[\"Close pricing window\"],\"R7zx6E\":[\"cloud\"],\"L/LPQZ\":[\"Cloud Pro coûte 9 $/utilisateur/mois (facturation annuelle). Organization, à 19 $/utilisateur/mois, débloque le SSO et les permissions au niveau des lignes pour les équipes qui exigent un contrôle d'accès plus fin.\"],\"WYgF8M\":[\"Cloud Pro starts at $9/user/month with unlimited custom objects. Self-host the open source core for free, or upgrade to Organization for SSO and row-level permissions.\"],\"1YncLF\":[\"Cofondateur de NetZero\"],\"4QGkvo\":[\"co-founder of NetZero\"],\"vWaYWP\":[\"Co-founder, NetZero\"],\"dcLsG5\":[\"Colombia 🇨🇴\"],\"b5bnuN\":[\"Column-to-field mapping (including relations)\"],\"ofoEsM\":[\"Coming soon!\"],\"KGD9Kt\":[\"Commercial license (no AGPL obligations)\"],\"OnPROL\":[\"Commercials\"],\"chL5IG\":[\"Communauté\"],\"8CLnho\":[\"Community support\"],\"RxpseA\":[\"Comoros 🇰🇲\"],\"SHjhDC\":[\"Company or brand *\"],\"Fkb+LW\":[\"Composez votre CRM et vos applications internes avec une seule boîte à outils d'extensibilité.\"],\"kD7ZGH\":[\"Composez votre CRM et vos applications internes avec une seule boîte à outils d'extensibilité. Modèle de données, mise en page et automatisation.\"],\"2DQw7/\":[\"Congo 🇨🇬\"],\"iSLIjg\":[\"Contact\"],\"90KBr0\":[\"Connect Google or Microsoft accounts\"],\"xgrBCK\":[\"Connect Google or Microsoft accounts and see emails and events linked to CRM records automatically.\"],\"dGwMkb\":[\"Connect your Gmail account to automatically associate emails with relevant 'People' and 'Companies'. Contacts you've emailed will be automatically added to 'People', excluding non-personal emails like support@ and team@. Control your privacy by selecting the information you share with your team.\"],\"MVrQxI\":[\"Connected via API\"],\"cfAG43\":[\"Consulting\"],\"GsUBlG\":[\"Contact \",[\"partnerName\"]],\"Oii3vg\":[\"Contacts & Companies\"],\"24qVhV\":[\"Context lives with the record.\"],\"mXovG/\":[\"Poursuivez l'itération *sans friction*\"],\"LqyWsJ\":[\"Contributors now have their very own hall of fame.\"],\"qVH+kL\":[\"Contributors page\"],\"+Uepfb\":[\"Control\"],\"GplbCP\":[\"Control without *the overhead*\"],\"wH1xmY\":[\"Le contrôle sans la lourdeur\"],\"Bj7igG\":[\"Control without the overhead\"],\"PiH3UR\":[\"Copied!\"],\"he3ygx\":[\"Copy\"],\"7qTWwB\":[\"Copy the enterprise key above.\"],\"PXnj76\":[\"Copy this key and paste it into your Twenty self-hosted instance settings.\"],\"FapWIq\":[\"Core Features\"],\"Al/blj\":[\"Costa Rica 🇨🇷\"],\"1B8JTc\":[\"Costs down more than *90%*\"],\"cRA2/z\":[\"Country *\"],\"kCu+Rq\":[\"Create a Kanban view on any object and streamline processes like recruitment or onboarding.\"],\"Xn2Nlq\":[\"Create a workflow\"],\"+kFrvb\":[\"Create and manage custom roles. Grant or revoke access for each object to Read/Create/Edit/Delete records. Give granular access to settings like the ability to manage users, data models or APIs.\"],\"t9znrt\":[\"Create and organize sidebar items more easily with a cleaner navigation setup.\"],\"B9nLrl\":[\"Créez des applications sur Twenty\"],\"yAL7FY\":[\"Create custom apps\"],\"20ZdFp\":[\"Create custom charts and visualizations using your workspace data with the new Dashboards feature. Available in Labs, this beta feature lets you build powerful analytics and insights to monitor your business metrics.\"],\"YxktRb\":[\"Create fields and edit field widgets more directly from record pages.\"],\"RRfcjH\":[\"Create flexible relationships where a single field can connect to multiple different object types. For example, an Opportunity can now relate to either a Person or a Company, giving you more versatile data modeling capabilities.\"],\"qCRCtk\":[\"Create more flexible relationships between objects, including more advanced many-to-many setups.\"],\"oS1RiS\":[\"Create tasks from records\"],\"D3S5+x\":[\"Create tasks, assign owners, and attach rich notes directly from any record. No tab-switching, no lost context.\"],\"egTba/\":[\"Created By\"],\"ppNnWO\":[\"Creating records on filtered views now applies the view filter to the newly created record. This feature is compatible with Text, Date_Time, Date, Number, Select, Rating, Multi_Select, Array, and Boolean fields.\"],\"NLgmM4\":[\"CRM audit · Requirements · Process mapping · ROI · RevOps · Vendor selection\"],\"Y44Xsf\":[\"CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again.\"],\"wDasLa\":[\"Ingénieur CRM\"],\"DqkzNV\":[\"CRM Engineer, AC&T Education Migration\"],\"b7vNti\":[\"CRM was a database you filled on Fridays. AI turned it into the system that runs your go-to-market. To differentiate, you have to build what your competitors can't buy.\"],\"ntHvtU\":[\"CRM was a ledger. *AI turned it into an operating system.*\"],\"OACAVp\":[\"Croatia 🇭🇷\"],\"I6FFSA\":[\"CSV export anytime\"],\"8RWevB\":[\"CSV import & export\"],\"s+QiQi\":[\"CSV import flow\"],\"zyTj4q\":[\"CSV import now supports 2,000+ rows, sub-fields such as labels and secondary phone numbers, and automatic field matching. Validations, layout, and upserts are improved for smoother, more accurate imports.\"],\"O2UtEV\":[\"Cuba 🇨🇺\"],\"auudI+\":[\"Currency Field\"],\"lh6aPn\":[\"Custom AI models\"],\"OaTurC\":[\"Custom apps\"],\"TcUCTv\":[\"Custom Apps · Scripts · AI/agent integrations\"],\"onPW5H\":[\"Custom date formats\"],\"yBSEtR\":[\"Custom deal stages for your process\"],\"L+b7SB\":[\"Custom deal stages, drag-and-drop boards, and real-time tracking so your pipeline reflects reality.\"],\"DUnke3\":[\"Custom Development\"],\"GAD3Dx\":[\"Custom domain\"],\"Vz1Vq2\":[\"Custom domain (crm.yourco.com)\"],\"oPwQt4\":[\"Custom fields\"],\"U1RB/7\":[\"Custom fields and relationships\"],\"WGKb6T\":[\"Custom fields, relationships, and a unified timeline for every contact and company in your workspace.\"],\"prIqWa\":[\"Custom layout\"],\"RuYs9T\":[\"Custom layouts\"],\"8skTDV\":[\"Custom objects\"],\"y5pLQH\":[\"Custom sidebar\"],\"AbyZbl\":[\"Custom views\"],\"5xK1jE\":[\"Histoires de clients\"],\"YjXLAQ\":[\"Customer Stories\"],\"BavWCk\":[\"Customer stories preview\"],\"0fgCyk\":[\"Customer story\"],\"zKLqOg\":[\"Customer story not found — Twenty\"],\"NihQNk\":[\"Clients\"],\"qqLY+j\":[\"Customization\"],\"GRfLAg\":[\"Customizations\"],\"dy0yuR\":[\"Customize your sub-domain\"],\"Pj5fGG\":[\"Cyprus 🇨🇾\"],\"w9VTXG\":[\"Czech\"],\"xkuHM6\":[\"Czech Republic 🇨🇿\"],\"4RLD4p\":[\"Daily messages\"],\"Fo2vDn\":[\"Danish\"],\"aebTao\":[\"Dashboards in Labs (Beta)\"],\"V0kvgB\":[\"Data import\"],\"5cNMFz\":[\"Data model\"],\"ZEsvS2\":[\"Data Model Diagram\"],\"iq2WTm\":[\"Data modeling · Migrations · No-code workflows · Dashboards · SSO/SCIM · Integrations\"],\"dSuMNg\":[\"Datetime Field\"],\"/TlpVf\":[\"Deals that move themselves.\"],\"H1UtjM\":[\"Denmark 🇩🇰\"],\"tqbpyT\":[\"Designed specifically for financial data, the <0>Currency Field ensures correct calculation and standard formatting for monetary figures. <1>Example Use Case: Record and manage global transactions in their original currencies while maintaining precision in financial reporting.\"],\"X5B6sd\":[\"Les équipes dev impulsent *le changement avec Twenty* à l'échelle de l'entreprise\"],\"n+SX4g\":[\"Développeurs\"],\"5atXgh\":[\"Developers can now take advantage of the new array field type to store non-predefined values.\"],\"canH5K\":[\"Developers can now use webhooks to synchronize customer data updates in real-time across applications.\"],\"ohFj56\":[\"Differentiation now *lives in the code you own.*\"],\"Wuqvfz\":[\"Directeur du numérique et de l'information, Elevate Consulting\"],\"gW1L7t\":[\"Director, W3villa Technologies, Partner\"],\"30qcNY\":[\"Discord (ouvre un nouvel onglet)\"],\"old0Lj\":[\"Discover the newest features and improvements in Twenty, the #1 Open Source CRM.\"],\"W+b/DF\":[\"Découvrez les nouveautés\"],\"rHLwDO\":[\"Djibouti 🇩🇯\"],\"Zjjbne\":[\"Faut-il un développeur pour personnaliser Twenty ?\"],\"Zx22Ih\":[\"Twenty fonctionne-t-il avec Claude, ChatGPT et Cursor ?\"],\"bMDnQR\":[\"Dominica 🇩🇲\"],\"ufcRA6\":[\"Dominican Republic 🇩🇴\"],\"pOLPPB\":[\"Ne restez pas prisonnier de l'écosystème d'un autre. L'expérience développeur de Twenty ressemble à du logiciel normal : installation locale, données réelles, tests en direct et aucun outillage propriétaire.\"],\"HDR0en\":[\"DR Congo 🇨🇩\"],\"mzedFr\":[\"Draft a workflow for an email sequence\"],\"q7M3jo\":[\"Drag and drop widgets to build record pages, dashboards, and layout pages that match the way your team actually works.\"],\"fPma12\":[\"Drag-and-drop deals between stages\"],\"KIjvtr\":[\"Dutch\"],\"6r6pDf\":[\"e.g. React, Postgres, n8n…\"],\"a35sCN\":[\"Each workspace now gets a dedicated sub-domain for a more secure experience. And soon you will be able to set your own domain.\"],\"s+5p5k\":[\"Easier field editing\"],\"nKXMzJ\":[\"Easier layouts\"],\"hEtClO\":[\"Ecuador 🇪🇨\"],\"4CJ4xV\":[\"EdTech\"],\"aqxYLv\":[\"Education\"],\"OAdXUT\":[\"Egypt 🇪🇬\"],\"2xK+An\":[\"El Salvador 🇸🇻\"],\"1wTjWx\":[\"Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth.\"],\"2THY70\":[\"Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data.\"],\"wiTeYI\":[\"Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs.\"],\"FNyrb0\":[\"Email & Calendar\"],\"jTgK6B\":[\"Email and calendar Blocklist\"],\"AoN898\":[\"Email and Chat\"],\"rc8HEz\":[\"Email replies\"],\"ObCvfI\":[\"Email sharing\"],\"7o9obN\":[\"Email thread widgets and an inline reply composer make it easier to work directly from messaging records.\"],\"hfqiVr\":[\"Email/calendar activity on each record\"],\"XGd8Wo\":[\"Emails & Calendar\"],\"o4/9l1\":[\"Emails and events linked to CRM records\"],\"QOINDn\":[\"empty\"],\"ZxDrUL\":[\"Enable beta features using the new Labs tab in settings. The first beta release introduces our workflow engine. Enjoy!\"],\"jkaFcU\":[\"Enabled two-factor authentication with authenticator apps like 1Password, Authy, or Microsoft Authenticator to add an extra layer of security at sign-in.\"],\"Qpn/bX\":[\"Encrypt your data\"],\"Iy8Gze\":[\"Encryption key rotation\"],\"lYGfRP\":[\"English\"],\"pNNVhg\":[\"Enhance your contact management by adding many email addresses for a single contact. All emails sent to these addresses will be automatically synced with the contact, ensuring you never miss an important communication.\"],\"kZ17+i\":[\"Enhance your data handling capabilities with the addition of four new field types:\"],\"CVqFAV\":[\"Enhanced Kanban Board\"],\"LKTMHa\":[\"Enhanced One-to-Many Relations Editing\"],\"ovz6sZ\":[\"Enhanced Timeline\"],\"Ijh+h+\":[\"Profitez d'une personnalisation illimitée avec les outils de codage IA que vous aimez déjà. Adaptez votre CRM à la façon dont votre entreprise grandit et gagne.\"],\"xoqD/n\":[\"Enter a valid email address.\"],\"/OVUD6\":[\"Enter a valid URL (starting with http:// or https://).\"],\"87BcPj\":[\"Enterprise *activation*\"],\"NTskGY\":[\"Enterprise Activation | Twenty\"],\"3dQ6zJ\":[\"Environments\"],\"c0nqfC\":[\"Equatorial Guinea 🇬🇶\"],\"4DIpFY\":[\"Eritrea 🇪🇷\"],\"JIhNLR\":[\"Estonia 🇪🇪\"],\"8yXuJ9\":[\"Eswatini 🇸🇿\"],\"rktGGp\":[\"Ethiopia 🇪🇹\"],\"rQqP1P\":[\"Europe\"],\"IhKZhp\":[\"Even the training material is a feature worth celebrating.\"],\"sQP1sF\":[\"Every new release of Twenty, the #1 Open Source CRM, with changelogs, demos, and the highlights teams care about most.\"],\"rkZTD7\":[\"Every thread, on the right record.\"],\"kz/8m8\":[\"Everything in Pro\"],\"zoNk7e\":[\"Tout se met à jour en temps réel, avec un chat IA toujours prêt à vous faire avancer plus vite.\"],\"/g9UKY\":[\"Everything you need, *out of the box*\"],\"2NGXKo\":[\"Expanded support for 30+ languages, so users can navigate and use the software in their preferred language.\"],\"14xdUh\":[\"Experience a more compact and intuitive settings layout, now featuring a breadcrumb navigation for easier access and better organization.\"],\"57gG1f\":[\"Experience enterprise-grade granularity, starting with an 11th permission.\"],\"uZRQi+\":[\"Expertise & experience\"],\"JTM5zS\":[\"Explore customer stories\"],\"weFouS\":[\"Extended run!\"],\"tX4pRm\":[\"Failed to activate enterprise key. Please try again.\"],\"akLvep\":[\"Une interface familière et moderne\"],\"gKNP7S\":[\"Farsi\"],\"abO45l\":[\"Un chemin rapide vers l'action\"],\"idFRAo\":[\"Faster field setup\"],\"3qy0z4\":[\"Favorites now live in the navigation menu, making the sidebar easier to organize and customize.\"],\"JrTb6F\":[\"Favorites Views and Favorites Folders\"],\"+LREeu\":[\"feature\"],\"hXRm6J\":[\"Field Level Permission\"],\"3Y3//3\":[\"Field widgets\"],\"QDxnW/\":[\"Field widgets are easier to configure directly from the page where you use them.\"],\"5SV9rS\":[\"Field widgets now support more relation types, so custom layouts work better across more objects.\"],\"e6BgMV\":[\"Field-level permissions\"],\"z+q1Th\":[\"Fiji 🇫🇯\"],\"sER+bs\":[\"Files\"],\"jxbpA9\":[\"Files in records\"],\"1t0xRH\":[\"Filter by Multi-Select\"],\"bOidm7\":[\"Filter partners\"],\"kUUNrw\":[\"Filter the content a webhook is returning so it only pings your URL when a specific action occurs, such as on creating a company.\"],\"iabLgo\":[\"Filtered metrics from any object\"],\"sRUAXp\":[\"Find a certified Twenty partner to migrate, customise, and operate your open source CRM, or join the ecosystem and grow your practice with us.\"],\"TJ7HQl\":[\"Find a partner\"],\"MD032e\":[\"Trouvez un partenaire Twenty\"],\"S6CEQ9\":[\"Find a Twenty Partner — Open Source CRM Marketplace\"],\"wHyJkT\":[\"Find the right partner to implement, customize, and tailor Twenty to your team.\"],\"5asqas\":[\"Find your *Twenty partner*\"],\"9V48qi\":[\"Finland 🇫🇮\"],\"USZ2N6\":[\"Finnish\"],\"PHM5wp\":[\"Flexibility\"],\"YsFkku\":[\"Flexible relations\"],\"HBJ0P5\":[\"Flow\\norchestration\"],\"obrJBN\":[\"Fly through your workspace with shortcuts and short load times.\"],\"HjFq2b\":[\"Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute.\"],\"mjIRMF\":[\"Focus on the use case, not the *plumbing*\"],\"P5E+kT\":[\"Focus on the use case, not the plumbing\"],\"wdVyxi\":[\"Folder/Label import\"],\"qwJuVW\":[\"Footer\"],\"CKQ0za\":[\"For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation.\"],\"yAJC9c\":[\"For twenty years, CRM meant the same thing: a place to log calls, track deals, and pull reports on Friday. The real work happened in people's heads, in Slack threads, in hallway conversations. The CRM kept score. Nobody expected more from it.\"],\"UCoxP5\":[\"Founder, Nine Dots Ventures\"],\"IPaRlc\":[\"Founder, Wintactix\"],\"671GY5\":[\"France 🇫🇷\"],\"tUgSXd\":[\"Free for you!\"],\"nLC6tu\":[\"French\"],\"weRlb1\":[\"from \",[\"minBudget\"]],\"Iuxc00\":[\"From CSV to CRM in minutes.\"],\"Mxpask\":[\"From documents to *open APIs*\"],\"emeKZ7\":[\"From documents to open APIs\"],\"2CtZ6T\":[\"From Salesforce to\\n*self-hosted Twenty*\"],\"kl+hEJ\":[\"From Salesforce to self-hosted Twenty\"],\"syU/BD\":[\"From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners\"],\"UfoVki\":[\"From simple to *advanced*\"],\"Lf7cb3\":[\"From simple to advanced\"],\"m1I5TY\":[\"Full communication history in one place\"],\"wXgKOm\":[\"Full customization\"],\"YZ7Q3Z\":[\"Full ownership\"],\"hdxwWi\":[\"Fully customizable\"],\"//hrfs\":[\"Gabon 🇬🇦\"],\"yau9J6\":[\"Gambia 🇬🇲\"],\"S84RWl\":[\"Generate tasks for my top 10 accounts\"],\"GOmD9p\":[\"Georgia 🇬🇪\"],\"DDcvSo\":[\"German\"],\"XcPIuI\":[\"Germany 🇩🇪\"],\"ZDIydz\":[\"Commencer\"],\"xyKSqi\":[\"Ghana 🇬🇭\"],\"3QRTgQ\":[\"GitHub (ouvre un nouvel onglet)\"],\"wuH0g5\":[\"Gmail integration\"],\"n8waaJ\":[\"Go the extra mile *with no-code*\"],\"Ay/vbT\":[\"Good choice!\"],\"opD7oA\":[\"Google Calendar Integration\"],\"Zh0acB\":[\"Grab 30 minutes so we can get to know your team.\"],\"1W3PAd\":[\"Granular Email Folder Sync\"],\"+tDN2S\":[\"Greece 🇬🇷\"],\"CZXzs4\":[\"Greek\"],\"DDgHcm\":[\"Grenada 🇬🇩\"],\"MCLWq4\":[\"Grandissez sur une fondation flexible\"],\"M/8CC1\":[\"Guatemala 🇬🇹\"],\"UZbq7J\":[\"Guinea 🇬🇳\"],\"vtpxPx\":[\"Guinea-Bissau 🇬🇼\"],\"GT8Ua2\":[\"Guyana 🇬🇾\"],\"5BLiJj\":[\"Haiti 🇭🇹\"],\"Xf5EJg\":[\"Générateur de demi-teintes\"],\"DHC85F\":[\"Halftone Generator | Twenty\"],\"c3XJ18\":[\"Aide\"],\"CRzGla\":[\"Help center\"],\"LiWOgh\":[\"Hey, I'm interested in meeting. Here's my project:\"],\"EhWatX\":[\"Hide changes\"],\"tGjibo\":[\"Hindi\"],\"qfSbUb\":[\"His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix.\"],\"i0qMbr\":[\"Accueil\"],\"CtU7yU\":[\"Homeseller\"],\"KYnPnU\":[\"Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together.\"],\"v6cmMq\":[\"Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time.\"],\"xaIV9m\":[\"Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty\"],\"zbfmqm\":[\"Honduras 🇭🇳\"],\"mqX9AX\":[\"Hosting & Infrastructure\"],\"SHZNBm\":[\"Hourly\"],\"Ivq5+7\":[\"Hourly rate\"],\"XnFo3G\":[\"How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership.\"],\"PYi0f6\":[\"How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership.\"],\"+MLOVo\":[\"How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack.\"],\"OIwpKt\":[\"Combien de temps faut-il pour démarrer ?\"],\"iRzy9e\":[\"How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows.\"],\"NZYA4S\":[\"How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day.\"],\"5sWcC0\":[\"How teams\\n*built with Twenty*\"],\"Z3Cabh\":[\"How Twenty collects, uses, and protects your data — our GDPR- and CCPA-compliant privacy policy.\"],\"URQPvK\":[\"How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone.\"],\"htrFcw\":[\"Hungary 🇭🇺\"],\"T6wyby\":[\"I'll book later →\"],\"RYDa0v\":[\"Iceland 🇮🇸\"],\"ePYQjq\":[\"Identity\"],\"Grur3I\":[\"IMAP\"],\"l0JGUk\":[\"Impersonate users\"],\"N4OVNn\":[\"Implementation\"],\"yHueLx\":[\"Implementation partners\"],\"9P1c4k\":[\"Implemented skeleton loading to improve user experience by displaying placeholder content while data is being fetched.\"],\"WxaeWx\":[\"Import Relations\"],\"BHNxPe\":[\"Import V2\"],\"ZAKTS6\":[\"Import your data with field mapping, including relations. Export anytime — your data is always yours.\"],\"cCwGqi\":[\"Improved Onboarding Experience\"],\"86Q2Qb\":[\"Improved Performance\"],\"InyU0Z\":[\"In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect.\"],\"d1Aru8\":[\"En production.\"],\"Sqb+jp\":[\"In-app preview for supported file types (when enabled)\"],\"3XP8Lk\":[\"Included!\"],\"/c4yUr\":[\"India 🇮🇳\"],\"iEJqDi\":[\"Indonesia 🇮🇩\"],\"BQukYF\":[\"Indonesian\"],\"S8gy7K\":[\"Industry\"],\"MeL8SS\":[\"Infinite scroll\"],\"+mOisw\":[\"Infinite scroll is still coming soon, unlike the invoice.\"],\"K8iwJx\":[\"Install shared tarball app\"],\"AHWM9N\":[\"Integration\"],\"OChKCc\":[\"Interactive halftone generator exported from Twenty.\"],\"+83cJG\":[\"Interested in meeting \",[\"partnerName\"]],\"MAqMna\":[\"Internal Email Privacy\"],\"0ysJ3C\":[\"Internal team emails won't sync, protecting privacy by preventing access to internal discussions.\"],\"a+PGuG\":[\"Internet accounts per user\"],\"87rKhU\":[\"Introduced a \\\"Data Model Diagram\\\" feature that allows users to visualize the relationships between different objects within the CRM.\"],\"vJncsm\":[\"Introduced a feature to calculate and display data summaries, such as sums and latest entries, for quick insights and streamlined data analysis.\"],\"TR1ici\":[\"Introduced a new design for notifications featuring lighter colors.\"],\"5G37wD\":[\"Introduced a new Link Field type to add and manage one or several external URLs on any object. Available in custom objects starting today.\"],\"5BnBV4\":[\"Introducing workflows, a powerful way to let you automate actions with form triggers, conditions, HTTP requests, webhooks, and serverless functions!\"],\"KBwqIW\":[\"Invite roles\"],\"FtgjCv\":[\"Iran 🇮🇷\"],\"8yynyz\":[\"Iraq 🇮🇶\"],\"s7XmoY\":[\"Ireland 🇮🇪\"],\"/yQIKP\":[\"Twenty est-il vraiment open source ?\"],\"SdtpDP\":[\"Israel 🇮🇱\"],\"QjEULz\":[\"It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other.\"],\"FJ51pP\":[\"C'est tout simplement une bien meilleure expérience qu'un Salesforce ou un HubSpot. Ma mission a été de rendre chaque outil accessible par API, pour que tout communique. Twenty l'a rendu possible d'une manière que les plateformes CRM plus anciennes ne permettent tout simplement pas.\"],\"kqIAbN\":[\"It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck.\"],\"ltNDOB\":[\"C'est fragile. La V1 sort vite, mais la maintenance et les évolutions deviennent un fardeau sur la durée.\"],\"Lj7sBL\":[\"Italian\"],\"OSTD8d\":[\"Italy 🇮🇹\"],\"0BTIQi\":[\"Ivory Coast 🇨🇮\"],\"W6o2Pv\":[\"Jamaica 🇯🇲\"],\"kpk6mj\":[\"Japan 🇯🇵\"],\"dFtidv\":[\"Japanese\"],\"Lsf2+K\":[\"Join our ecosystem and help businesses take control of their customer data with open-source primitives.\"],\"1qiriB\":[\"Join our growing partner ecosystem\"],\"VQIurp\":[\"Join our partner ecosystem and help businesses take control of their CRM.\"],\"m/pXki\":[\"Join the teams that chose to own their CRM. Start building with Twenty today.\"],\"QbxNys\":[\"Jordan 🇯🇴\"],\"VnZMnC\":[\"JSON Field\"],\"pB76mP\":[\"Jul 2025\"],\"hvwlu3\":[\"Jun 2025\"],\"qrYDGE\":[\"Justin Beadle\"],\"vYXuJI\":[\"Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions.\"],\"E6Oohx\":[\"Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it.\"],\"3LDjR0\":[\"Kanbans on any object\"],\"r1cFAW\":[\"Kazakhstan 🇰🇿\"],\"kEahsE\":[\"Kenya 🇰🇪\"],\"TLanjj\":[\"kept\"],\"IxBSi8\":[\"Kiribati 🇰🇮\"],\"h6S9Yz\":[\"Korean\"],\"PqhUrP\":[\"Kosovo 🇽🇰\"],\"3+TwF3\":[\"Kuwait 🇰🇼\"],\"e9zZkH\":[\"Kyrgyzstan 🇰🇬\"],\"8QgJZb\":[\"Labs\"],\"GAmD3h\":[\"Languages\"],\"u6jooT\":[\"Languages spoken\"],\"YHacTY\":[\"Laos 🇱🇦\"],\"2lrGbG\":[\"LATAM\"],\"WvrtRi\":[\"Latest\\n*Releases*\"],\"7OHfcc\":[\"Latvia 🇱🇻\"],\"rdU729\":[\"Layout\"],\"+Ss/og\":[\"Apprenez à utiliser Twenty\"],\"wB0DGn\":[\"Lebanon 🇱🇧\"],\"vifyyw\":[\"Mentions légales\"],\"UqdHpG\":[\"Lesotho 🇱🇸\"],\"rJargy\":[\"Liberia 🇱🇷\"],\"Lzw0kM\":[\"Libya 🇱🇾\"],\"tHFTlp\":[\"Licensee:\"],\"K41WYc\":[\"Liechtenstein 🇱🇮\"],\"ESTOTK\":[\"Like any regular object, add some custom fields to your tasks and companies or create some custom views to better organize your content.\"],\"kvxPie\":[\"Link field\"],\"gggTBm\":[\"LinkedIn\"],\"3hSKC5\":[\"LinkedIn (ouvre un nouvel onglet)\"],\"Gg69LR\":[\"LinkedIn URL\"],\"2WIZYd\":[\"Lithuania 🇱🇹\"],\"AHVzME\":[\"Données en direct et IA intégrée\"],\"GObQuL\":[\"Live updates\"],\"zmRZwk\":[\"Live updates are unavailable, which is almost more honest.\"],\"ObPscj\":[\"Loading activation…\"],\"Oyf4mg\":[\"Loading form…\"],\"Pwqkdw\":[\"Loading…\"],\"7VBQ2j\":[\"Local, Production\"],\"JO8Bdx\":[\"Lock-in\"],\"sQia9P\":[\"Connexion\"],\"KPLAuI\":[\"Lower CRM cost\"],\"J13skq\":[\"Luxembourg 🇱🇺\"],\"nRYQC8\":[\"Madagascar 🇲🇬\"],\"/hmUGb\":[\"Maintenance mode\"],\"BNd15Z\":[\"Rendez votre équipe GTM heureuse avec *un CRM qu'elle va adorer*\"],\"qHvKxh\":[\"Malawi 🇲🇼\"],\"tF97tn\":[\"Malay\"],\"DIOh5g\":[\"Malaysia 🇲🇾\"],\"62/ScF\":[\"Maldives 🇲🇻\"],\"wc5E/3\":[\"Mali 🇲🇱\"],\"04fjhR\":[\"Malta 🇲🇹\"],\"Si4WyF\":[\"Management Consulting\"],\"TMZPkv\":[\"Manual trigger workflows now support bulk selection, allowing you to select multiple records at once to pass into your workflow. This is particularly useful when combined with the iterator node to process several records in one workflow run.\"],\"poX06f\":[\"Manual work at core\"],\"VJOKPB\":[\"Maps view\"],\"Zt5PUS\":[\"Marketplace\"],\"2jVbnO\":[\"Marshall Islands 🇲🇭\"],\"bJNKJ1\":[\"Maîtrisez Twenty dans ses moindres recoins\"],\"HG/EUg\":[\"Mauritania 🇲🇷\"],\"YDiaY/\":[\"Mauritius 🇲🇺\"],\"Zw+Zv+\":[\"MCP server\"],\"bwCiCi\":[\"Rencontrez les agences et consultants certifiés qui déploient Twenty pour des équipes du monde entier.\"],\"ujYZ+f\":[\"Meet the teams who shaped Twenty into their own CRM with self-hosted deployments, AI-assisted workflows, and API-first product stacks.\"],\"CQ9M36\":[\"MENA\"],\"+9RIKB\":[\"Merge Records\"],\"briyJf\":[\"Metrics you can actually trust.\"],\"YBLFQZ\":[\"Mexico 🇲🇽\"],\"KBirDR\":[\"Micronesia 🇫🇲\"],\"YeVpda\":[\"Microsoft o365 Integration\"],\"so04x6\":[\"Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it.\"],\"izddzp\":[\"Mike Babiy\"],\"3TSz9S\":[\"Minimize\"],\"FFFENV\":[\"Minimum project budget\"],\"179i38\":[\"Model your data, add business logic, and design layouts — everything you need to ship an app on top of Twenty, in one place.\"],\"6m8rMT\":[\"Moldova 🇲🇩\"],\"qRRmSe\":[\"Monaco 🇲🇨\"],\"G+EV+A\":[\"Mongolia 🇲🇳\"],\"9VDoNp\":[\"Montenegro 🇲🇪\"],\"+8Nek/\":[\"Monthly\"],\"paxFAm\":[\"More field relations\"],\"kHdAOE\":[\"More Field Types, More Power\"],\"VqXuUv\":[\"More options available!\"],\"AZrhlt\":[\"More powerful search\"],\"LAFO4Y\":[\"Morocco 🇲🇦\"],\"E4h9+U\":[\"Morph Many Relationships\"],\"EwJDrS\":[\"Mozambique 🇲🇿\"],\"dlKkNL\":[\"Multi-file upload on records\"],\"4nwdYp\":[\"Multi-Record Workflow Triggers\"],\"S5w2Q/\":[\"Multi-Select Field\"],\"Gorywi\":[\"Multi-Workspace\"],\"QGWbbv\":[\"Myanmar 🇲🇲\"],\"6YtxFj\":[\"Name\"],\"yYmxee\":[\"Namibia 🇳🇦\"],\"zVOV14\":[\"Nauru 🇳🇷\"],\"Akl9+2\":[\"Navigate more quickly with our revamped record page navbar: Navigate directly from one record page to another. View the total number of records within a view. Easily return to the corresponding index view with a new \\\"Close\\\" button.\"],\"TizFpt\":[\"Menu de navigation\"],\"LfNsfa\":[\"Need a quick change? Skip the engineering ticket. Customize your workspace in minutes.\"],\"4sbgPq\":[\"Need help with customization?\"],\"LNVNNE\":[\"Nepal 🇳🇵\"],\"g60EgR\":[\"Netherlands 🇳🇱\"],\"8Cp4Of\":[\"NetZero\"],\"J8ZssL\":[\"NetZero exploite une configuration Twenty modulaire couvrant crédits carbone, produits agricoles et systèmes industriels.\"],\"7HVBV+\":[\"NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows.\"],\"3PtYTO\":[\"NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation.\"],\"zgjuZq\":[\"New Array field type\"],\"cU1+gU\":[\"New record page\"],\"pAKqTG\":[\"New Settings layout\"],\"a54odP\":[\"New Side Panel\"],\"/DTtCF\":[\"New Zealand 🇳🇿\"],\"GY6uSc\":[\"Next →\"],\"KqojOL\":[\"Next steps\"],\"awYrJD\":[\"Témoignage suivant\"],\"iBOZv7\":[\"Nicaragua 🇳🇮\"],\"61NU7V\":[\"Niger 🇳🇪\"],\"+2NLII\":[\"Nigeria 🇳🇬\"],\"qZ+egR\":[\"Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations.\"],\"sGuHDu\":[\"Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day.\"],\"G0GGKA\":[\"Nine Dots Ventures\"],\"1UzENP\":[\"No\"],\"6tRXQ4\":[\"No matching country.\"],\"1hNHaC\":[\"No more renting someone else's *structure*\"],\"LmWdm6\":[\"No more renting someone else's structure\"],\"UxK4so\":[\"No partners match your filters\"],\"nDjC8E\":[\"No session ID provided. Please complete the checkout first.\"],\"q9f4Tp\":[\"No-code\"],\"SiZ/7E\":[\"Non. Créez objets, champs, vues et workflows no-code directement depuis les Réglages. Sans limite, sans surcoût.\"],\"096JXI\":[\"North Korea 🇰🇵\"],\"IwF7aJ\":[\"North Macedonia 🇲🇰\"],\"sZwk4U\":[\"Norway 🇳🇴\"],\"1IipHp\":[\"Norwegian\"],\"YfzRVa\":[\"Notes and Tasks standard objects\"],\"iDNBZe\":[\"Notifications\"],\"k3T2mM\":[\"Now a developer can describe what they want to Claude Code and have a working app in an afternoon. A custom object, a scoring workflow, a new view, an integration. The bottleneck isn't building anymore. It's whether your platform lets you.\"],\"CzeIij\":[\"Number of dashboards\"],\"pkrZnO\":[\"Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first.\"],\"l/1LQc\":[\"Olivier Reinaud\"],\"BdShAR\":[\"Oman 🇴🇲\"],\"D2b+1q\":[\"On a single CRM\"],\"w5ATz2\":[\"On record pages, you can now expand relation cards to view their fields without navigating to their individual record pages. For example, on a Company record page, you can expand an employee card to view their job title. This feature applies to all types of objects, including custom ones.\"],\"XhXmzW\":[\"On this page\"],\"jxC7HY\":[\"Onboarding · Documentation · Change management · L1/L2 support · Managed services\"],\"pbmZ7R\":[\"Onboarding Packs\"],\"37OSdM\":[\"One *API* to rule them all\"],\"Zt1UZb\":[\"One API to rule them all\"],\"pShqss\":[\"Only $5 for SSO. Practically a charity program.\"],\"GSr0rF\":[\"Ouvrir le menu\"],\"pkXQA+\":[\"Open your Twenty self-hosted instance Settings → Enterprise.\"],\"5RkmVr\":[\"Open-source, AI-ready, and yours to shape.\"],\"ucgZ0o\":[\"Organization\"],\"nDTfhz\":[\"Other improvements\"],\"3PlK59\":[\"Our onboarding process has been streamlined to let you import your calendar and emails seamlessly. You can now also configure your privacy settings directly during onboarding, allowing you to choose between sharing content with your team or keeping it hidden.\"],\"dKGg8T\":[\"Out of stock\"],\"PASC/7\":[\"Outlived every redesign since 2004.\"],\"Bwsi7B\":[\"Maîtrisez votre CRM de bout en bout\"],\"oDAEQq\":[\"Ownership\"],\"NmF/Vo\":[\"Owning your stack remains mysteriously out of stock.\"],\"h/oMMb\":[\"Packaged CRMs make every company look the same. Twenty is the open source CRM teams shape around their workflow, with a modern UI and a developer-first platform.\"],\"+AiiMt\":[\"Pagination builds character.\"],\"sW3DaS\":[\"Pakistan 🇵🇰\"],\"cvRU36\":[\"Palau 🇵🇼\"],\"u2htNd\":[\"Palestine 🇵🇸\"],\"pWLp16\":[\"Panama 🇵🇦\"],\"xOR4tu\":[\"Papua New Guinea 🇵🇬\"],\"kb3PhK\":[\"Paraguay 🇵🇾\"],\"cLitIC\":[\"Partner application\"],\"mYGIvm\":[\"Partner facts and contact\"],\"4RPECg\":[\"Partner not found — Twenty Partners\"],\"dRIK0d\":[\"Partner testimonials\"],\"mPkInZ\":[\"Partenaires\"],\"9yo8NN\":[\"Paste the key and click Activate.\"],\"TMErUt\":[\"Percentage in number fields\"],\"v1i9+n\":[\"Performance Improvements\"],\"JjOHl8\":[\"Permissions V1\"],\"kJQ+gL\":[\"Permissions V2\"],\"OzAIDr\":[\"Peru 🇵🇪\"],\"LqRs8D\":[\"Philippines 🇵🇭\"],\"we6gj5\":[\"Pick every category that applies.\"],\"KEEuJt\":[\"Pick your model, build agents that write emails or enrich records inside workflows, and expose your workspace to any MCP-compatible client.\"],\"FFkjaT\":[\"Pipeline Management\"],\"gzkkC3\":[\"Pipelines, custom objects, AI assistants, and a native API on top of Postgres. Twenty is the open source CRM with the modern UX teams actually want to use.\"],\"z7gnI9\":[\"Please complete all required fields before continuing.\"],\"AFr2a5\":[\"Poland 🇵🇱\"],\"trnWaw\":[\"Polish\"],\"/LAeug\":[\"Portrait of \",[\"authorName\"]],\"8BrmUs\":[\"Portugal 🇵🇹\"],\"MOERNx\":[\"Portuguese\"],\"z87IFG\":[\"Press Enter or comma to add a skill.\"],\"LZoO8F\":[\"Témoignage précédent\"],\"a7u1N9\":[\"Price\"],\"aHCEmh\":[\"Tarifs\"],\"T/R+Qz\":[\"Navigation principale\"],\"J2IAmT\":[\"Dirigeant et fondateur\"],\"kXBQYM\":[\"Principal and Founder, Alternative Partners\"],\"k62X/2\":[\"Priority support\"],\"LcET2C\":[\"Politique de confidentialité\"],\"DJ3uVe\":[\"Privacy Policy | Twenty\"],\"3fPjUY\":[\"Pro\"],\"K47k8R\":[\"Produit\"],\"kIGKva\":[\"Une qualité de niveau production\"],\"vERlcd\":[\"Profile\"],\"CcK9cq\":[\"Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around.\"],\"PaHxQd\":[\"Project minimum\"],\"9NAqO4\":[\"Proposal automation\"],\"a24q7E\":[\"Proprietary languages, slow deployment cycles, and \\\"black box\\\" logic.\"],\"u9RZ7+\":[\"Punjabi\"],\"frfCYp\":[\"Q1 2026\"],\"tFx+ES\":[\"Qatar 🇶🇦\"],\"OialmJ\":[\"Quickly identify who created a given record and what was the origin of the creation, whether it was through a CSV import, an API, or manual input.\"],\"3XOwjg\":[\"Rates\"],\"zXRspj\":[\"Rating field\"],\"DnWJal\":[\"Reach out\"],\"gSQVmr\":[\"Lire le cas client\"],\"EqCbT9\":[\"Read/Edit/Delete permissions\"],\"/6qiAz\":[\"Ready to build\\n*your own story?*\"],\"TqQ08B\":[\"Ready to grow\\n*with Twenty?*\"],\"zTY2by\":[\"Real customer stories from teams running their business on Twenty: how they migrated, what they customised, and what changed once their CRM finally fit.\"],\"NIwjHh\":[\"Real Estate\"],\"CH+Ona\":[\"Real stories from real teams about how they shaped Twenty to fit their workflow and accelerated their growth.\"],\"5O1eTm\":[\"Real-time changes? That will be a premium surprise.\"],\"4hc7hc\":[\"Real-time data\"],\"dKQCrj\":[\"Real-time is a state of mind, not a feature.\"],\"P7gVBH\":[\"Record is created or updated trigger\"],\"Zhiuz9\":[\"Record quarter\"],\"PWlTvh\":[\"Records\"],\"q45OlW\":[\"Regions\"],\"GtQZI0\":[\"Relation Fields on Record Page\"],\"plY6Rp\":[\"Relations on Record Pages\"],\"rwWjWg\":[\"Notes de version\"],\"5icoS1\":[\"Versions\"],\"BkBq/5\":[\"Remove \",[\"0\"],\" filter\"],\"OY7BZk\":[\"Remove \",[\"skill\"]],\"a/aGHe\":[\"Rename, download, and delete attachments\"],\"t9yxlZ\":[\"Reports\"],\"SY/an2\":[\"Reports & Dashboards\"],\"TD9BOQ\":[\"Reset conversation\"],\"ZYyPd8\":[\"Reset layouts to default, pick tab icons, and connect shortcuts to specific page layouts.\"],\"tpLAlL\":[\"Resize navbar and side panel\"],\"s+MGs7\":[\"Ressources\"],\"oC2l7f\":[\"REST & GraphQL API\"],\"kx0s+n\":[\"Results\"],\"2itg0p\":[\"Retro 2015\"],\"H0dEn+\":[\"Return traffic light\"],\"k2x4+M\":[\"Revamp View Options Menu\"],\"7xiRJz\":[\"Revamped Navigation Bar\"],\"lHXjXQ\":[\"Revamped Side Panel\"],\"frqduN\":[\"Rich notes attached to records\"],\"i4ofLR\":[\"Rich text layouts\"],\"/gaSVU\":[\"Roadmap\"],\"mLp5AP\":[\"Romania 🇷🇴\"],\"uJc01W\":[\"Romanian\"],\"Wdh41P\":[\"Row-level permissions\"],\"mRpuWW\":[\"Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks.\"],\"T1ut28\":[\"Russia 🇷🇺\"],\"nji0/X\":[\"Russian\"],\"dw8D3T\":[\"Rwanda 🇷🇼\"],\"niLOap\":[\"Saint Kitts & Nevis 🇰🇳\"],\"zCHzF/\":[\"Saint Lucia 🇱🇨\"],\"Md/8iQ\":[\"Saint Vincent 🇻🇨\"],\"Burn4/\":[\"Salesfarce Add-on Center\"],\"xTfEgV\":[\"Salesfarce Pro\"],\"/UolBB\":[\"Salesforce Classic\"],\"l69E+u\":[\"Salesforce migration\"],\"CADlRK\":[\"Same CRM\"],\"60i6S+\":[\"Same output\"],\"xl2tJ9\":[\"Same results\"],\"w9QWxz\":[\"SAML/OIDC SSO\"],\"R38ZPo\":[\"Samoa 🇼🇸\"],\"fK288K\":[\"San Marino 🇸🇲\"],\"KDcBQd\":[\"São Tomé & Príncipe 🇸🇹\"],\"/BK0Nl\":[\"Saudi Arabia 🇸🇦\"],\"elz5ka\":[\"Saved / month\"],\"h3C5H8\":[\"Scaffold components, workflows, and skills directly from Claude Code, Cursor, or the CLI, and commit them back to your workspace.\"],\"bifv6N\":[\"Scale\"],\"aI/fdL\":[\"Scale without *breaking operations*\"],\"842ybw\":[\"Scale without breaking operations\"],\"vk6sVR\":[\"Search a country…\"],\"+yNkue\":[\"Search in field pickers and add-column menus makes table and layout customization faster.\"],\"HVOGoW\":[\"Seats limit\"],\"a3LDKx\":[\"Security\"],\"nmVU/t\":[\"See how teams\\nbuild *on Twenty*\"],\"aB+XpI\":[\"See more features\"],\"JDp1bg\":[\"See updates as they happen. Work with your team and agents seamlessly.\"],\"0kgOPB\":[\"Découvrez les nouveautés de la \",[\"0\"]],\"02ePaq\":[\"Select \",[\"0\"]],\"wgNoIs\":[\"Select all\"],\"6p/m5q\":[\"Select your country\"],\"sXYD/i\":[\"self\"],\"6JhL+3\":[\"Self-hosted\"],\"QFK/45\":[\"Self-hosted (Docker/K8s) · Cloud architecture · Scaling · Security · Monitoring\"],\"42Nf4Y\":[\"Self-hosted *means control*\"],\"zuU9UU\":[\"Self-hosted billing\"],\"5CWy3T\":[\"Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs.\"],\"5WmQ5O\":[\"Self-hosted means control\"],\"WxVgfh\":[\"Self-hosted workspaces can now track usage more cleanly with usage-based billing support.\"],\"GrBvv/\":[\"Self-hosting\"],\"YdhUoe\":[\"Self-hosting, now for rent!\"],\"uVBq8r\":[\"Self-Onboarding\"],\"NaHz2o\":[\"Selfhosting\"],\"pi1oME\":[\"Send message\"],\"D50Vyu\":[\"Senegal 🇸🇳\"],\"eEJlq0\":[\"Serbia 🇷🇸\"],\"62gxWx\":[\"Seychelles 🇸🇨\"],\"3VFzsh\":[\"Lancez un produit sur Twenty\"],\"Ta0ts5\":[\"Show changes\"],\"6lGV3K\":[\"Show less\"],\"RhU4bB\":[\"Showing \",[\"visibleCount\"],\" of \",[\"totalCount\"],\" partners\"],\"I89wN/\":[\"Showing all \",[\"totalCount\"],\" partners\"],\"9k9PMD\":[\"Sidebar items\"],\"yhyNch\":[\"Sierra Leone 🇸🇱\"],\"mA6cL1\":[\"Inscrivez-vous au Cloud en moins d'une minute et commencez votre essai de 30 jours. Pour les déploiements plus larges, nos packs d'onboarding de 4 heures ou nos partenaires certifiés vous mettent en production en 1 à 2 semaines.\"],\"qTFDyz\":[\"Simple\\n*Pricing*\"],\"0eG5g+\":[\"Singapore 🇸🇬\"],\"V9dFwD\":[\"Plan du site\"],\"c+cRP3\":[\"Skeleton Loading\"],\"PCSkw2\":[\"Skills\"],\"t6ComU\":[\"Évitez l'UX laborieuse qui accompagne toujours le sur-mesure.\"],\"U7keXg\":[\"Slovakia 🇸🇰\"],\"o1VTTF\":[\"Slovenia 🇸🇮\"],\"1v/aHN\":[\"Smart ⌘K\"],\"bUmSwL\":[\"Des modèles intelligents, des raccourcis et des mises en page rendent les tâches quotidiennes plus rapides et plus simples à exécuter.\"],\"GUqjZ0\":[\"Réseaux sociaux\"],\"b+F/Ih\":[\"Soft Delete\"],\"L58Ivq\":[\"Soft delete feature added: Deleted records are now hidden from view but recoverable from the \\\"Deleted record\\\" option in any object options menu. No more drama!\"],\"6sKjjx\":[\"Solo\"],\"FX2oa1\":[\"Solo or agency?\"],\"TcZtfs\":[\"Solomon Islands 🇸🇧\"],\"TvdMI3\":[\"Solutioning\"],\"t1E06j\":[\"Somalia 🇸🇴\"],\"AVfp38\":[\"Some call this enterprise pricing. We prefer a CRM where API access, webhooks, and workflows don't show up as surprise add-ons.\"],\"Lllsp+\":[\"Some teammate changes now appear right away, so collaboration feels faster and more up to date.\"],\"B/mYo/\":[\"Source code access\"],\"zHJB/O\":[\"South Africa 🇿🇦\"],\"7MdTKh\":[\"South Korea 🇰🇷\"],\"a4jo+V\":[\"South Sudan 🇸🇸\"],\"Kv3C8d\":[\"Spain 🇪🇸\"],\"65A04M\":[\"Spanish\"],\"00jcbn\":[\"Sri Lanka 🇱🇰\"],\"vnS6Rf\":[\"SSO\"],\"uQl22y\":[\"Standard support\"],\"wxW2Sv\":[\"Start automating at huge scale!\"],\"XO628f\":[\"Start for free\"],\"sBOFB0\":[\"Start your free trial today\\nwithout credit card.\"],\"ThcPyu\":[\"Gardez le contrôle avec notre *logiciel open source*\"],\"j9c8rb\":[\"Stay in Flow\"],\"GdGiNi\":[\"Step \",[\"current\"],\" of \",[\"total\"]],\"bxgoJR\":[\"Des guides pas à pas et des playbooks pour aider votre équipe à tirer le meilleur de son espace de travail.\"],\"jKt86V\":[\"Cessez de lutter contre le sur-mesure. *Commencez à construire, avec Twenty*\"],\"UCLArd\":[\"Cessez de vous contenter de compromis.\"],\"hjgBcp\":[\"Stop Workflow Button\"],\"3QIOGT\":[\"Sub-field Filtering\"],\"eVPr22\":[\"Sub-field filtering is now supported for currency, address, name, email, link, phone, and actor fields. For example, you can filter by the amount in a currency without needing the full field.\"],\"Sv4BSp\":[\"Subdomain (yourco.twenty.com)\"],\"H5/rZQ\":[\"Submit application\"],\"MDqQmP\":[\"Submitting…\"],\"8Z1557\":[\"Sudan 🇸🇩\"],\"XYLcNv\":[\"Support\"],\"Aq66kg\":[\"Suriname 🇸🇷\"],\"Yz+oFV\":[\"Swahili\"],\"6u3kqB\":[\"swap\"],\"b2//Ip\":[\"Sweden 🇸🇪\"],\"UaISq3\":[\"Swedish\"],\"IImT5c\":[\"Switzerland 🇨🇭\"],\"sjuSub\":[\"Syria 🇸🇾\"],\"3w+Aox\":[\"Table, Kanban, Calendar\"],\"ISVD3+\":[\"Tagalog\"],\"9M02G5\":[\"Tailor record pages, menus, and views\"],\"boABlR\":[\"Taiwan 🇹🇼\"],\"XJspRJ\":[\"Tajikistan 🇹🇯\"],\"jYsF4G\":[\"Take control of your running workflows with the new Stop Workflow button. When a workflow is in progress, you can now immediately halt its execution, giving you the flexibility to cancel operations that are no longer needed or troubleshoot issues in real-time.\"],\"JAKtcG\":[\"Parlez-nous\"],\"fb427h\":[\"Tamil\"],\"ri1l89\":[\"Tanzania 🇹🇿\"],\"GWMpL3\":[\"Tasks & Activities\"],\"Ye3KKA\":[\"Faites équipe avec un expert Twenty\"],\"vsdUaL\":[\"Technical notes\"],\"y+bLyB\":[\"Technical skills\"],\"Hevu8X\":[\"Terminal mode\"],\"mvP/25\":[\"Conditions générales\"],\"xowcRf\":[\"Terms of Service\"],\"BEX1RA\":[\"Terms of Service | Twenty\"],\"VUZDlr\":[\"Témoignages\"],\"SUr44j\":[\"Thai\"],\"6t7gpr\":[\"Thailand 🇹🇭\"],\"Pa/Y6/\":[\"Thanks, you're in.\\n*Now book your intro call.*\"],\"FjkPYg\":[\"That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients.\"],\"8S4psU\":[\"That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer.\"],\"zXlFuT\":[\"Le CRM open source nº 1 pour les équipes modernes. Modulaire, évolutif et conçu pour épouser votre activité.\"],\"K1T7Mn\":[\"The <0>JSON Field allows for the storage of complex, structured data within a single field, thus expanding the capabilities for data customisation and integration. <1>Example Use Case: Store configurable data for a product, such as feature flags or customization options, directly within a CRM record.\"],\"KzqOXm\":[\"The <0>Multi-Select Field allows for tagging a record with multiple attributes, providing a flexible way to classify and filter data. <1>Example Use Case: Tag a company record with multiple industries such as \\\"Retail,\\\" \\\"Technology,\\\" and \\\"Finance,\\\" enabling more nuanced segmentation and analysis.\"],\"6wVgAW\":[\"The bet is *paying off*\"],\"NT2bSJ\":[\"The bet is paying off\"],\"Wie492\":[\"The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in.\"],\"2kHqXc\":[\"The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them.\"],\"EYi+kT\":[\"The CRM as a *control hub*\"],\"2sfVd8\":[\"The CRM as a control hub\"],\"XlFsoH\":[\"The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant.\"],\"kCUcnD\":[\"The flexibility is just amazing. Literally, there's nothing you cannot do. You can create objects, access everything through the API, pull notes and send them to the portal. Try doing that in HubSpot. No way. It's the true ability to build exactly what's actually needed.\"],\"MaHqAc\":[\"C'est vraiment la flexibilité qui a fait la différence. Nos besoins évoluent très vite. Je découvre un nouveau besoin et en deux clics j'y réponds. C'est un vrai avantage quand on avance vite.\"],\"Q5iZ9Q\":[\"The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy.\"],\"l0eUFC\":[\"The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever.\"],\"SW9clW\":[\"The future of CRM is built, *not bought.*\"],\"sm10Rg\":[\"Le monolithe géant\"],\"nFB8I1\":[\"Le fardeau du fait-maison\"],\"ZNzKXV\":[\"The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic.\"],\"nf1NnD\":[\"The new <0>Address Field Type enables entry of a full address in one field, while structurally storing each address part - such as street name and number - in separate subfields.\"],\"tADBQB\":[\"The new Rating field represents a numeric value from zero to five, it can be useful for various use-cases such as scoring leads.\"],\"q1kKLq\":[\"The opportunity\"],\"80f4ed\":[\"Les principes et la philosophie produit derrière le CRM open source.\"],\"2NJdyz\":[\"Le problème.\"],\"GTy93s\":[\"The record page now features a clearer layout with increased space for content\"],\"3/wAFg\":[\"The result\"],\"nAWeyi\":[\"The result is a system that fits how AC&T already worked, instead of the other way around.\"],\"WENmFq\":[\"The right *foundation*\"],\"nbHA9N\":[\"The right foundation\"],\"g8h2v+\":[\"The search feature now includes ranking scores. This helps you find the most relevant results faster.\"],\"9CCRtB\":[\"The search node now lets you customize the result limit above 1, enabling you to retrieve multiple records in a single search operation. This enhancement works seamlessly with the iterator node for processing search results.\"],\"omVXTg\":[\"The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source.\"],\"1tN3qf\":[\"The shift\"],\"iW6MjB\":[\"The side panel now opens next to your content rather than above it, giving you a better overview while configuring workflows or viewing record details. This new layout is especially handy for workflows and the upcoming dashboards feature.\"],\"AnGOwN\":[\"The situation\"],\"gXGp3Q\":[\"L'histoire derrière Twenty\"],\"axo4rg\":[\"The terms governing your use of Twenty and its open source CRM services.\"],\"xCAT8U\":[\"The timeline on every record page has been significantly improved. It now provides detailed updates for: Record creations Field updates Received emails Created calendar events\"],\"u0uFxg\":[\"Eux, ce sont les vraies ventes\"],\"53RXLB\":[\"They call it customer loyalty. We call it a very affectionate cage.\"],\"RhmZMe\":[\"They did not just replace a tool. They took back ownership of how their business runs.\"],\"ZnqwXn\":[\"They did not want to learn someone else's system. They wanted to keep working the way they already did and make it smoother.\"],\"5YzqyT\":[\"They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control.\"],\"AUV+TY\":[\"Thinking\"],\"8gek0+\":[\"This feature gives you the ability to merge two records into one. This combines their information and keeps linked data, helping you remove duplicates and keep records accurate.\"],\"6f8QUY\":[\"Timor-Leste 🇹🇱\"],\"WwTFtc\":[\"To enhance privacy, you can now add specific email addresses to a blocklist within the \\\"Accounts\\\" settings. This feature prevents sensitive content from being synced to the CRM when corresponding with certain individuals. This can be particularly useful when managing sensitive deals.\"],\"ijf9QM\":[\"To maintain the simplicity of Twenty, we are introducing \\\"Advanced Settings.\\\" This option consolidates all settings intended for advanced use cases, often preferred by developers, such as API and function settings or security settings.\"],\"DeTupk\":[\"Togo 🇹🇬\"],\"CocxTO\":[\"Tonga 🇹🇴\"],\"5eFktS\":[\"Tool integration\"],\"xv7HSr\":[\"total per month with fixed cost\"],\"hmu++i\":[\"Track amount and close date\"],\"POzmFl\":[\"Suivez chaque version avec changelogs, temps forts et démos des dernières fonctionnalités.\"],\"6vHPh9\":[\"Track relationships, manage pipelines, and take action quickly with an intuitive CRM that helps your team move faster from day one with confidence.\"],\"xwWQ9Q\":[\"Training & Adoption\"],\"MtCqjl\":[\"Training, Adoption & Support\"],\"VhVAzf\":[\"Translation in 30+ Languages\"],\"/ga9kq\":[\"Trinidad & Tobago 🇹🇹\"],\"tdZpCd\":[\"Centre de confiance\"],\"HlusPQ\":[\"Trust the n°1 CRM, *or not!*\"],\"KtyN0b\":[\"ils nous font confiance\"],\"QZdPWP\":[\"Des organisations de premier plan nous font confiance\"],\"eslLQF\":[\"Try it live\"],\"qhmtws\":[\"Try removing some filters or browse all partners.\"],\"E/hGy3\":[\"Try Twenty Cloud\"],\"D5Kf4t\":[\"Tuesday your team learns that deals with a technical champion close 3x faster. Wednesday you add the field, wire up the scoring, adjust the workflow. By Thursday your agents are acting on it. That feedback loop is the edge. And it only works if the CRM is yours.\"],\"y4UxlS\":[\"Tunisia 🇹🇳\"],\"UIDKnJ\":[\"Turkey 🇹🇷\"],\"Kz91g/\":[\"Turkish\"],\"kdJl4v\":[\"Turkmenistan 🇹🇲\"],\"tSc/a3\":[\"Tuvalu 🇹🇻\"],\"O5dAmW\":[\"Twenty | CRM open source nº 1\"],\"NalB1c\":[\"Twenty Apps opens the door to building products, not just implementations. For example, we're developing a WhatsApp Business integration that any Twenty's client could get. That's a recurring revenue stream we wouldn't have if we were just configuring someone else's platform.\"],\"fZsVj6\":[\"Twenty as the\\n*API backbone* of a go-to-market stack\"],\"+w9xZW\":[\"Twenty as the API backbone of a go-to-market stack\"],\"zj0CA+\":[\"Twenty as the API backbone of a go-to-market stack | Elevate Consulting\"],\"neM1Ol\":[\"Twenty CRM Features — Modern Open Source CRM Platform\"],\"8zCqPL\":[\"Twenty CRM Pricing — Plans from $9 per User per Month\"],\"D05UQH\":[\"Twenty Customers — How Modern Teams Run Their CRM\"],\"MYHdd/\":[\"Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market.\"],\"fwep/o\":[\"Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it.\"],\"0qyMhk\":[\"Twenty donne aux équipes techniques les briques pour construire un CRM sur mesure, qui répond aux besoins métier complexes et évolue avec l'entreprise.\"],\"jVhq41\":[\"Twenty gives you the kind of flexibility that actually changes what you can offer your clients. The dev experience is clean, the APIs are open, and when something needs to be customized, you can just do it. There's no fighting the platform.\"],\"x/I85y\":[\"Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible.\"],\"zvfdHM\":[\"Twenty is the heart of the system. Everything branches from it.\"],\"K+zzSQ\":[\"Twenty lets us build a CRM around the business and not the business around the CRM.\"],\"AxT+g4\":[\"Twenty rend les choses simples. C'est épuré, intuitif et conçu pour rappeler Notion.\"],\"mZ3xRm\":[\"Écosystème de partenaires Twenty\"],\"4SJucz\":[\"Twenty Partners — Certified Open Source CRM Implementers\"],\"vD7S1X\":[\"Version \",[\"0\"],\" de Twenty — \",[\"1\"]],\"X1GHuJ\":[\"Twenty Releases — What's New in the Open Source CRM\"],\"V1lV7B\":[\"Twenty team support\"],\"osa7Xg\":[\"Aperçu du guide d'utilisation de Twenty\"],\"KsFvUt\":[\"Twenty's certified partners help teams migrate, customise, and operate the open source CRM across regions, languages, and deployment models. Browse profiles and book a call.\"],\"tuvLv1\":[\"Two Factor Authentication\"],\"EIU345\":[\"Two-factor authentication\"],\"O+vc/1\":[\"Type of team *\"],\"P+R1Lc\":[\"Typical project\"],\"HqFilh\":[\"UAE 🇦🇪\"],\"+WNTxL\":[\"Uganda 🇺🇬\"],\"uxuy4l\":[\"UI theme\"],\"tNfmmF\":[\"UK 🇬🇧\"],\"z7UkhA\":[\"Ukraine 🇺🇦\"],\"V9+2pH\":[\"Ukrainian\"],\"jqzUyM\":[\"Unavailable\"],\"Hix/m6\":[\"Unified timeline (emails, events, tasks, notes, files)\"],\"NIuIk1\":[\"Unlimited\"],\"q7vKOJ\":[\"Unlisted Views\"],\"aGpTSC\":[\"Up to 5 workspaces\"],\"KQsreu\":[\"Updated by\"],\"SPdRRU\":[\"Upfront consulting, scoping, strategy.\"],\"WLb3m4\":[\"Upgraded Search\"],\"2vanwz\":[\"Upload, rename, preview, and manage files directly on records. Everything stays where it belongs.\"],\"tmwuH9\":[\"Urdu\"],\"huOaG8\":[\"Uruguay 🇺🇾\"],\"RCOibx\":[\"US\"],\"LXHEIS\":[\"USA 🇺🇸\"],\"Roaswv\":[\"Guide d'utilisation\"],\"9iX1i3\":[\"User impersonation\"],\"3XIgKU\":[\"User roles\"],\"UCUX2+\":[\"User-side rollout & ongoing support.\"],\"FOOEtP\":[\"Uzbekistan 🇺🇿\"],\"CRXL2j\":[\"Vanuatu 🇻🇺\"],\"NNeEYO\":[\"Vatican 🇻🇦\"],\"BWzac4\":[\"Venezuela 🇻🇪\"],\"fDWr8s\":[\"Version control\"],\"FlQ1vR\":[\"Vietnam 🇻🇳\"],\"fROFIL\":[\"Vietnamese\"],\"BRBSny\":[\"View \",[\"0\"],\" on LinkedIn\"],\"V4nZs/\":[\"View Groups\"],\"ITdNGt\":[\"View on LinkedIn\"],\"73lp8c\":[\"View profile\"],\"BAzC1v\":[\"View types\"],\"mHtVst\":[\"Visualize your customers on a map!\"],\"CsHuOr\":[\"VP de l'ingénierie\"],\"uRh799\":[\"VP de l'ingénierie chez W3villa Technologies\"],\"w2INie\":[\"VP of Engineering, W3villa Technologies\"],\"s0tU5h\":[\"W3Grads\"],\"R8BueT\":[\"W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone.\"],\"7hHsoV\":[\"W3villa a construit W3Grads pour des simulations d'entretiens IA à grande échelle, avec Twenty comme colonne vertébrale opérationnelle.\"],\"QBOUnd\":[\"W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing.\"],\"7q5Vjn\":[\"W3villa Technologies\"],\"ZabLEt\":[\"W3villa Technologies set out to solve it properly, not with a workaround, but with a product.\"],\"3v2ipf\":[\"W3villa a utilisé Twenty comme framework de niveau production pour le modèle de données, les permissions, l'authentification et le moteur de workflows qu'ils auraient sinon dû reconstruire eux-mêmes.\"],\"k1Pevc\":[\"We are pleased to reopen the cloud subscription to everyone. No more waiting!\"],\"8CHatv\":[\"We could not submit your application. Please try again in a moment.\"],\"ofRgSN\":[\"We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind.\"],\"MjWeUE\":[\"Nous ne voulions pas rafistoler le problème. Nous voulions construire quelque chose sur lequel des institutions pourraient compter à grande échelle, et cela exigeait une fondation assez solide pour porter toute la complexité de notre vision.\"],\"GVxbgf\":[\"We have improved app performance, shaving off over 500ms on each page.\"],\"6C4xTI\":[\"We have significantly enhanced our search performance, making it feel instantaneous when searching for records such as people, companies, or tasks.\"],\"l7iJRt\":[\"We started a major ⌘K revamp that now understands the context to display appropriate actions. For example, on a record page, you can add the record as a favorite, or if you select multiple records on an index, you can export them as a CSV.\"],\"d5CWI6\":[\"We're building the #1 Open Source CRM, but we can't do it alone. Join our partner ecosystem and grow with us.\"],\"DFlq8J\":[\"We’ve added an \\\"any field search\\\" filter that lets you search across all fields at once. For example, it can allow you to locate a customer by their phone number, whether it's stored in the \\\"Mobile,\\\" \\\"Office,\\\" or \\\"Direct Line\\\" field.\"],\"kenNyf\":[\"We’ve added IMAP support to let you connect email accounts for receiving messages. You can also set up SMTP to send emails and CalDAV to sync calendars.\"],\"5CT1rV\":[\"We’ve cut key load and interaction times by over 3,000ms, which means pages now load 2x faster!\"],\"xBnjMX\":[\"We've introduced advanced settings for email and calendar management: <0>Auto-Create Contact Options: Choose when an email interaction should automatically create a contact. Options include: People I've sent emails to and received emails from People I've sent emails to Don't auto create contact <1>Email Exclusions: Ability to exclude non-professional emails (e.g., Gmail, Outlook) and team emails (e.g., support@, team@) from being synced to the CRM. <2>Calendar Events: Auto-contact creation settings are now available for calendar events as well.\"],\"v1kQyJ\":[\"Webhooks\"],\"ZhnM/K\":[\"Webhooks (Change Data Capture)\"],\"K4G86X\":[\"Webhooks filter\"],\"FaPmsq\":[\"Webhooks multi-object filtering\"],\"hgDePr\":[\"Website or GitHub\"],\"Lx0cVD\":[\"What an admin can do without writing code.\"],\"Z34FQq\":[\"What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company.\"],\"phiBjc\":[\"Combien coûte Twenty ?\"],\"WVQaGB\":[\"What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible.\"],\"iOAq7n\":[\"What is next\"],\"tWd6MT\":[\"What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together.\"],\"kRfFDB\":[\"What they do\"],\"aYRqmz\":[\"What this means\"],\"QCHIzm\":[\"What you cover *\"],\"1kfjxX\":[\"Whatever came next had to be something they could own.\"],\"cs6VpJ\":[\"When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop.\"],\"chISDP\":[\"When importing records, you can now import relations between records. For example, you can import a CSV file that includes a column for related records, such as linking contacts to companies or tasks to projects.\"],\"qqPUvu\":[\"When the channel is *the business*\"],\"JglRo/\":[\"When the channel is the business\"],\"nkkLPM\":[\"When the vendor *pulled the plug*\"],\"DajeYD\":[\"When the vendor pulled the plug\"],\"8SbakK\":[\"When your CRM is\\n*the product*\"],\"OQ41z8\":[\"When your CRM is the product\"],\"Svuneu\":[\"When your CRM is the product: W3Grads on Twenty | W3villa Technologies\"],\"2O07UN\":[\"Where & how\"],\"bGN8u+\":[\"While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty.\"],\"DJlSwA\":[\"Pourquoi\"],\"mrxgOV\":[\"Pourquoi les équipes choisissent Twenty\"],\"4sOVu+\":[\"Pourquoi Twenty\"],\"DH7vVZ\":[\"Why Twenty — The Open Source CRM Built to Be Customised\"],\"tetjz4\":[\"Illustration Pourquoi Twenty\"],\"7KJZ0z\":[\"Window controls\"],\"V+BOYT\":[\"With Google Calendar integration, you can track all your team's events with a company or person in your CRM. Choose the information level visible to your teammates for better control.\"],\"edwOmb\":[\"With the <0>Datetime Field, you can effectively track events, deadlines, and activities with enhanced accuracy, improving time management and scheduling. <1>Example Use Case: Precisely track and set reminders for project milestones and deadlines.\"],\"OKVlnc\":[\"With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket.\"],\"OX5bbs\":[\"Work email *\"],\"5VGHpF\":[\"Workflow branches\"],\"9MLcn+\":[\"Workflow branches allow workflows to split paths, enabling conditional logic and multiple outcome flows in automation.\"],\"XYIks/\":[\"Workflow Bulk Select\"],\"gDMfQI\":[\"Workflow Filters\"],\"aNVMLK\":[\"Workflow improvements\"],\"EnPi2W\":[\"Workflow Iterator Node\"],\"jN2u/p\":[\"Workflow Search Node Limit\"],\"woYYQq\":[\"Workflows\"],\"OteDxj\":[\"Workflows that *actually get used*\"],\"AzqmMJ\":[\"Workflows that actually get used\"],\"pmUArF\":[\"Workspace\"],\"bwECg/\":[\"Workspace URL, customer references, relevant links…\"],\"p3ZD6C\":[\"X (ouvre un nouvel onglet)\"],\"zkWmBh\":[\"Yearly\"],\"S6izIJ\":[\"Yemen 🇾🇪\"],\"l75CjT\":[\"Yes\"],\"bo6pUs\":[\"Oui, avec notre framework Apps. Générez une extension avec `npx create-twenty-app` et livrez objets personnalisés, fonctions de logique côté serveur, composants React rendus dans l’interface de Twenty, compétences et agents IA, vues et navigation — le tout en TypeScript, déployable sur n’importe quel espace de travail.\"],\"yIcBW6\":[\"Oui. Chaque espace de travail Cloud embarque un serveur MCP natif. Connectez votre assistant IA via OAuth et il pourra lire et écrire vos données CRM en langage naturel.\"],\"8xYMYQ\":[\"Oui. Importez vos données via CSV, ou utilisez notre API au-delà de 50 000 enregistrements. Nos partenaires peuvent prendre en charge la migration complète.\"],\"8m0eN9\":[\"Oui. Twenty est le CRM open source nº 1 sur GitHub. Auto-hébergez-le pour posséder pleinement votre infrastructure, ou utilisez notre cloud managé pour une exploitation zéro-ops.\"],\"Q3GDrw\":[\"You can now add your views to favorites for quick access and organize your favorites into folders for better management.\"],\"wvm+7M\":[\"You can now control which fields a role can view or edit. This adds more granular access control on top of existing object-level permissions.\"],\"Wg/o59\":[\"You can now create number fields that display a percentage instead of a regular number.\"],\"BAWUUs\":[\"You can now create personal views that stay out of the shared Workspace section and appear instead under a separate <0>My unlisted views section in the view picker. These unlisted views are only listed for their creator, but can still be opened by teammates via direct link.\"],\"nbc7CM\":[\"You can now delete up to 10,000 records at once. (For when you want to Marie Kondo your database! 🧹)\"],\"dCaNPC\":[\"You can now edit one-to-many relations directly from the \\\"many side\\\". This means you can assign people to a company directly from the company list view, instead of having to navigate to each individual person's profile to assign them a company.\"],\"HX2309\":[\"You can now filter an object (People, Companies, Opportunities, etc.) using any multiselect field.\"],\"/eqpqH\":[\"You can now filter multiple actions simultaneously with a single webhook. For example, you can create a webhook that triggers only when a person or company is updated or created.\"],\"HeaQGk\":[\"You can now impersonate a workspace user as an admin. This allows you to see the workspace as that user would, which is useful for troubleshooting issues or understanding user experience.\"],\"l2z97k\":[\"You can now link your Microsoft account to easily manage your messages and events right within your workspace.\"],\"QN6ytb\":[\"You can now loop through items in your workflows using the new iterator node. This powerful feature allows you to process multiple records sequentially, performing actions on each item in a collection.\"],\"pYoGew\":[\"You can now navigate from one object to another directly from the record detail page.\"],\"mpOPSr\":[\"You can now preview file attachments without downloading them.\"],\"PoxYsC\":[\"You can now rename a view and change its type between kanban or table directly from the view options menu located to the right of the filter and sort buttons.\"],\"S4LCu8\":[\"You can now resize the side panel and navigation menu to view content more easily. This is especially useful on record pages with long content.\"],\"uS4RtA\":[\"You can now run workflows on many records at once. Previously, manual workflows could only be triggered one record at a time. This change improves productivity for bulk operations. With the ability to trigger workflows on many records, you can now: Send bulk emails to selected contacts Update many records with the same workflow logic Process batches of data more efficiently\"],\"px+QAM\":[\"You can now see who last updated a record\"],\"OVoVQg\":[\"You can now switch between workspaces by clicking your workspace name at the top left of the screen. This feature will only appear if you have been invited to join another workspace.\"],\"eheMXY\":[\"You can now trigger workflows when a record is created or updated.\"],\"XEEpNj\":[\"You can now visualize your records in a monthly calendar view. This new view type makes it easy to track time-based data like events, deadlines, and scheduled activities directly within any object.\"],\"LJ3sTb\":[\"You don't buy your deployment pipeline off the shelf. You don't rent your data warehouse from a vendor who decides the schema. You build it, you own it, you iterate on it every week. CRM is going the same way. The teams that treat it as infrastructure they own will compound an advantage every quarter.\"],\"AUzqeZ\":[\"You now have the ability to duplicate nodes, change node types, and use a streamlined filter design in your workflows.\"],\"SfJVcK\":[\"Your checkout is complete. Follow the steps below to copy your license key into your Twenty instance.\"],\"krHgj1\":[\"Your enterprise key\"],\"+dxjCu\":[\"Your enterprise license has been activated successfully.\"],\"pEQiCY\":[\"Your name *\"],\"fQATWn\":[\"Your network, fully mapped.\"],\"sgod9b\":[\"Your workspace is backed by a git repo, so you can branch, review in pull requests, and roll back changes the same way you ship code.\"],\"CgGN5T\":[\"Zambia 🇿🇲\"],\"wHjFOw\":[\"Zero\"],\"ZvEoMq\":[\"Zero manual work at the core. Full automation. Built on Twenty.\"],\"TT3YXb\":[\"Zimbabwe 🇿🇼\"],\"ACjxWW\":[\"Zoom\"]}")as Messages; \ No newline at end of file diff --git a/packages/twenty-website-redone/tsconfig.json b/packages/twenty-website-redone/tsconfig.json deleted file mode 100644 index cdc3035e36..0000000000 --- a/packages/twenty-website-redone/tsconfig.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "compilerOptions": { - "target": "es2020", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - "incremental": true, - "plugins": [ - { - "name": "next" - }, - { - "name": "typescript-styled-plugin", - "lint": { - "validProperties": ["text-wrap"] - } - } - ], - "paths": { - "@/*": ["./src/*"] - }, - "types": ["node", "jest"], - "noUnusedLocals": true, - "noUnusedParameters": true - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts" - ], - "exclude": ["node_modules"] -} diff --git a/packages/twenty-website-redone/wrangler.jsonc b/packages/twenty-website-redone/wrangler.jsonc deleted file mode 100644 index f2f0bd76b0..0000000000 --- a/packages/twenty-website-redone/wrangler.jsonc +++ /dev/null @@ -1,100 +0,0 @@ -{ - "$schema": "node_modules/wrangler/config-schema.json", - "name": "twenty-website", - "main": ".open-next/worker.js", - "compatibility_date": "2026-04-15", - // `global_fetch_strictly_public` forces the skew handler's cross-version - // fetch to `-..workers.dev` to take the public - // Internet path. Without it, Cloudflare's optimized intra-account routing - // self-loops back to the current worker (timeouts → 522). - "compatibility_flags": ["nodejs_compat", "global_fetch_strictly_public"], - "assets": { - "directory": ".open-next/assets", - "binding": "ASSETS", - // Worker must intercept asset requests so it can route /_next/static/* - // and /_next/data/* from a stale client to the matching old Worker - // version (skew protection). Cloudflare's edge cache still absorbs hot - // paths, so this isn't a 5× Worker invocation tax in practice. - "run_worker_first": true, - }, - // Per-version preview URLs are how skew protection routes a stale request - // to the old deployment: `-..workers.dev`. - "preview_urls": true, - "observability": { - "enabled": true, - }, - "env": { - "dev": { - "name": "twenty-website-dev", - "routes": [ - { - "pattern": "twenty-main.com", - "custom_domain": true, - }, - { - "pattern": "www.twenty-main.com", - "custom_domain": true, - }, - ], - "r2_buckets": [ - { - "binding": "NEXT_INC_CACHE_R2_BUCKET", - "bucket_name": "twenty-website-cache-dev", - }, - ], - // Self-reference so OpenNext can fire-and-forget background ISR - // revalidations instead of blocking the request. Per-env because the - // service name must match the deployed worker name. - "services": [ - { - "binding": "WORKER_SELF_REFERENCE", - "service": "twenty-website-dev", - }, - ], - // Skew-protection runtime inputs. The handler reads these to construct - // `-..workers.dev` - // when routing a stale request to an older Worker version. - "vars": { - "CF_WORKER_NAME": "twenty-website-dev", - // OpenNext appends `.workers.dev` itself when constructing the - // per-version preview URL — passing the full `twentyhq.workers.dev` - // here would yield `…twentyhq.workers.dev.workers.dev` and 404. - // See https://github.com/opennextjs/opennextjs-cloudflare/issues/811 - "CF_PREVIEW_DOMAIN": "twentyhq", - }, - }, - "prod": { - "name": "twenty-website-prod", - "routes": [ - { - "pattern": "twenty.com", - "custom_domain": true, - }, - { - "pattern": "www.twenty.com", - "custom_domain": true, - }, - ], - "r2_buckets": [ - { - "binding": "NEXT_INC_CACHE_R2_BUCKET", - "bucket_name": "twenty-website-cache-prod", - }, - ], - "services": [ - { - "binding": "WORKER_SELF_REFERENCE", - "service": "twenty-website-prod", - }, - ], - "vars": { - "CF_WORKER_NAME": "twenty-website-prod", - // OpenNext appends `.workers.dev` itself when constructing the - // per-version preview URL — passing the full `twentyhq.workers.dev` - // here would yield `…twentyhq.workers.dev.workers.dev` and 404. - // See https://github.com/opennextjs/opennextjs-cloudflare/issues/811 - "CF_PREVIEW_DOMAIN": "twentyhq", - }, - }, - }, -} diff --git a/packages/twenty-website-redone/wyw-in-js.config.cjs b/packages/twenty-website-redone/wyw-in-js.config.cjs deleted file mode 100644 index 8a04d8b17d..0000000000 --- a/packages/twenty-website-redone/wyw-in-js.config.cjs +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - babelOptions: { - presets: [ - require.resolve('next/babel'), - require.resolve('@wyw-in-js/babel-preset'), - ], - compact: true, - }, -}; diff --git a/packages/twenty-website/.env.example b/packages/twenty-website/.env.example index 8d0f6619ec..b3ac1c405d 100644 --- a/packages/twenty-website/.env.example +++ b/packages/twenty-website/.env.example @@ -1,50 +1,31 @@ -PARTNER_APPLICATION_WEBHOOK_URL= - -# Optional GitHub personal-access token (no scopes required) used by the -# community-stats fetcher (`src/lib/community/fetch-github-star-count.ts`). -# When set, requests use the 5000/hr authenticated limit instead of the -# 60/hr unauthenticated per-IP limit. Both responses are also cached for -# one hour via `unstable_cache`, so dev without a token still works. -# GITHUB_TOKEN= - -# Public site URL — canonical origin used by `metadataBase`, sitemap, robots, -# OG/Twitter card URLs, Stripe checkout success URL, and billing portal return. -# No trailing slash. Defaults to https://twenty.com when unset. +# Public site URL — canonical origin used by metadataBase, sitemap, robots, +# OG/Twitter card URLs, Stripe checkout success URL, and the billing portal +# return URL. No trailing slash. Defaults to https://twenty.com when unset. NEXT_PUBLIC_WEBSITE_URL= -# --- Visual runtime kill switches --------------------------------------- -# Hard kill switch for every WebGL/Three/R3F decorative visual on the site. -# Set to "1" / "true" to ship a build with all heavy visuals statically -# replaced by their fallbacks (e.g. during a GPU-driver-related incident). -# NEXT_PUBLIC_DISABLE_HEAVY_VISUALS= +# Partner application — the form POSTs to /api/partner-application, which +# forwards the payload to this webhook with the secret as a bearer credential. +PARTNER_APPLICATION_WEBHOOK_URL= +PARTNER_APPLICATION_SECRET= -# Soft cap on the number of concurrent WebGL contexts the page is allowed -# to spin up. The browser's own hard cap is typically 8–16; we default to 8 -# so a single page that mounts every illustration cannot exhaust the GPU -# context pool on integrated graphics. -# NEXT_PUBLIC_MAX_WEBGL_CONTEXTS=8 - -# Stripe — self-hosted enterprise checkout & subscription APIs -STRIPE_SECRET_KEY= -STRIPE_ENTERPRISE_MONTHLY_PRICE_ID= -STRIPE_ENTERPRISE_YEARLY_PRICE_ID= - -# RS256 key pair used to sign enterprise license JWTs (use literal \n in PEM for env) -ENTERPRISE_JWT_PRIVATE_KEY= -ENTERPRISE_JWT_PUBLIC_KEY= - -# Optional: short-lived validity token length in days (default 30) -# ENTERPRISE_VALIDITY_TOKEN_DURATION_DAYS= - -# Shared secret guarding the internal enterprise key reissue support endpoint, -# used to regenerate an enterprise key -ENTERPRISE_ADMIN_API_SECRET= - -# Twenty workspace the partners marketplace reads partner data from +# Partners marketplace — the Twenty workspace the partner directory reads from # (server-side only) via the /s/partners REST endpoint. TWENTY_PARTNERS_API_URL= TWENTY_PARTNERS_API_KEY= -# Cal.com path (no host) the partner application success screen books the intro -# call onto, e.g. acme/partner-intro. Falls back to a built-in default when unset. -NEXT_PUBLIC_PARTNER_INTRO_CAL_LINK= +# Stripe — self-hosted enterprise checkout & subscription APIs. +STRIPE_SECRET_KEY= +STRIPE_ENTERPRISE_MONTHLY_PRICE_ID= +STRIPE_ENTERPRISE_YEARLY_PRICE_ID= + +# RS256 key pair used to sign and verify enterprise license JWTs +# (use literal \n for newlines in the PEM values). +ENTERPRISE_JWT_PRIVATE_KEY= +ENTERPRISE_JWT_PUBLIC_KEY= + +# Optional: enterprise validity token lifetime in days (default 30). +# ENTERPRISE_VALIDITY_TOKEN_DURATION_DAYS= + +# Shared secret guarding the internal enterprise key reissue endpoint +# (POST /api/enterprise/reissue), used to regenerate an enterprise key. +ENTERPRISE_ADMIN_API_SECRET= diff --git a/packages/twenty-website/.gitignore b/packages/twenty-website/.gitignore index 2c0524c1b0..343df47880 100644 --- a/packages/twenty-website/.gitignore +++ b/packages/twenty-website/.gitignore @@ -1,53 +1,18 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies /node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js /.next/ /out/ - -# generated (e.g. Playwright screenshots) -/output/ - -# production -/build - -# misc .DS_Store -*.pem - -# debug npm-debug.log* yarn-debug.log* yarn-error.log* - -# local env files .env .env* +!.env.example +*.tsbuildinfo +next-env.d.ts -# vercel -.vercel - -# cloudflare / opennext +# OpenNext / Cloudflare Workers .open-next/ .wrangler/ .dev.vars cloudflare-env.d.ts - -# typescript -*.tsbuildinfo -next-env.d.ts - -# DB -*.sqlite - -# local-only memory files (not for commit) -/Documentation.md -/Todo.md diff --git a/packages/twenty-website/.oxlintrc.json b/packages/twenty-website/.oxlintrc.json index b5af6b9985..766fbf702e 100644 --- a/packages/twenty-website/.oxlintrc.json +++ b/packages/twenty-website/.oxlintrc.json @@ -1,107 +1,16 @@ { - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["react", "typescript", "import", "unicorn"], + "$schema": "../../node_modules/oxlint/configuration_schema.json", + "ignorePatterns": [], "categories": { - "correctness": "error" + "correctness": "error", + "suspicious": "error", + "perf": "error" }, - "ignorePatterns": ["node_modules", "src/locales/generated"], + "plugins": ["react", "typescript", "oxc", "unicorn"], "rules": { - "func-style": ["error", "declaration", { "allowArrowFunctions": true }], - "no-console": "off", - "no-control-regex": "off", - "no-debugger": "error", - "no-duplicate-imports": "error", - "no-undef": "off", - "no-unused-vars": "off", - "no-redeclare": "off", - "import/no-duplicates": "error", - "typescript/no-redeclare": "error", - "typescript/ban-ts-comment": "error", - "typescript/consistent-type-imports": [ - "error", - { - "prefer": "type-imports", - "fixStyle": "inline-type-imports" - } - ], - "typescript/explicit-function-return-type": "off", - "typescript/explicit-module-boundary-types": "off", - "typescript/no-empty-object-type": [ - "error", - { - "allowInterfaces": "with-single-extends" - } - ], - "typescript/no-empty-function": "off", - "typescript/no-explicit-any": "off", - "typescript/no-unused-vars": [ - "warn", - { - "vars": "all", - "varsIgnorePattern": "^_", - "args": "after-used", - "argsIgnorePattern": "^_" - } - ], - "react/no-unescaped-entities": "off", - "react/prop-types": "off", - "react/jsx-key": "off", - "react/display-name": "off", - "react/jsx-uses-react": "off", "react/react-in-jsx-scope": "off", - "react/jsx-no-useless-fragment": "off", - "react/jsx-props-no-spreading": ["error", { "explicitSpread": "ignore" }], - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "warn" - }, - "overrides": [ - { - "files": ["**/sections/**/*.ts", "**/sections/**/*.tsx"], - "rules": { - "no-restricted-imports": [ - "error", - { - "patterns": [ - { - "group": ["@/app/**"], - "message": "Sections are page-agnostic primitives — they must not depend on a specific route. Move shared halftone primitives into `src/lib/halftone/`, shared types into `src/sections/
/types/`, and shared data into `src/lib/`. (See ARCHITECTURE.md → Layering rules.)" - } - ] - } - ] - } - }, - { - "files": ["**/lib/**/*.ts", "**/lib/**/*.tsx"], - "rules": { - "no-restricted-imports": [ - "error", - { - "patterns": [ - { - "group": ["@/app/**", "@/sections/**"], - "message": "`lib/` is the leaf layer. It must not depend on routes (`app/`) or page sections (`sections/`). Invert the dependency: have the consumer pass values in. (See ARCHITECTURE.md → Layering rules.)" - } - ] - } - ] - } - }, - { - "files": ["**/design-system/**/*.ts", "**/design-system/**/*.tsx"], - "rules": { - "no-restricted-imports": [ - "error", - { - "patterns": [ - { - "group": ["@/app/**", "@/sections/**", "@/lib/**"], - "message": "Design-system primitives must only depend on `@/theme` (and `@/icons` for components that legitimately render an icon). They must not reach into routes, sections, or lib. (See ARCHITECTURE.md → Layering rules.)" - } - ] - } - ] - } - } - ] + "typescript/no-explicit-any": "error", + "typescript/consistent-type-definitions": ["error", "type"], + "no-unused-vars": "error" + } } diff --git a/packages/twenty-website/.prettierignore b/packages/twenty-website/.prettierignore deleted file mode 100644 index 23c4124138..0000000000 --- a/packages/twenty-website/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -src/locales/generated diff --git a/packages/twenty-website/README.md b/packages/twenty-website/README.md deleted file mode 100644 index 3ead95ac44..0000000000 --- a/packages/twenty-website/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# twenty-website - -```bash -yarn install -yarn nx run twenty-website:dev -yarn nx run twenty-website:build -yarn nx run twenty-website:lint -yarn nx run twenty-website:typecheck -``` diff --git a/packages/twenty-website/jest.config.mjs b/packages/twenty-website/jest.config.mjs index 04bf99188b..861c0b385e 100644 --- a/packages/twenty-website/jest.config.mjs +++ b/packages/twenty-website/jest.config.mjs @@ -1,52 +1,43 @@ -import { readFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { pathsToModuleNameMapper } from 'ts-jest'; -import { fileURLToPath } from 'url'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - -const tsConfig = JSON.parse( - readFileSync(resolve(__dirname, './tsconfig.json'), 'utf8'), -); - -const jestConfig = { - displayName: 'twenty-website', +const baseProject = { preset: '../../jest.preset.js', - testEnvironment: 'node', - transformIgnorePatterns: ['../../node_modules/'], + setupFilesAfterEnv: ['/test/setup-jest-dom.ts'], + transformIgnorePatterns: [ + '/node_modules/(?!(twenty-ui|twenty-shared)/.*)', + '../../node_modules/(?!(twenty-ui|twenty-shared)/.*)', + ], transform: { - '^.+\\.[tj]sx?$': [ + '^.+\\.(ts|js|tsx|jsx|mjs)$': [ '@swc/jest', { jsc: { parser: { syntax: 'typescript', tsx: true }, - experimental: { - plugins: [ - [ - '@lingui/swc-plugin', - { - runtimeModules: { - i18n: ['@lingui/core', 'i18n'], - trans: ['@lingui/react', 'Trans'], - }, - }, - ], - ], - }, transform: { react: { runtime: 'automatic' } }, }, }, ], }, moduleNameMapper: { - '^server-only$': '/jest/server-only-stub.ts', - ...pathsToModuleNameMapper(tsConfig.compilerOptions.paths, { - prefix: '/', - }), + '^@/(.*)$': '/src/$1', + '^@lingui/core/macro$': '/test/lingui-macro-mock.ts', }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], - extensionsToTreatAsEsm: ['.ts', '.tsx'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'mjs'], +}; + +const jestConfig = { + projects: [ + { + ...baseProject, + displayName: 'node', + testEnvironment: 'node', + testMatch: ['/src/**/*.test.ts'], + }, + { + ...baseProject, + displayName: 'jsdom', + testEnvironment: 'jsdom', + testMatch: ['/src/**/*.test.tsx'], + }, + ], coverageDirectory: './coverage', }; diff --git a/packages/twenty-website/jest/server-only-stub.ts b/packages/twenty-website/jest/server-only-stub.ts deleted file mode 100644 index 55493fc8aa..0000000000 --- a/packages/twenty-website/jest/server-only-stub.ts +++ /dev/null @@ -1,5 +0,0 @@ -// jest stub for the `server-only` package. `server-only` is a Next.js build -// guard (errors if a server module is pulled into a client bundle); it has no -// behaviour at runtime and no resolution under the jest node environment, so we -// map it to this empty module. The real guard still runs during `next build`. -export {}; diff --git a/packages/twenty-website/lingui.config.ts b/packages/twenty-website/lingui.config.ts index 7393f65cbe..4ecb9a8c26 100644 --- a/packages/twenty-website/lingui.config.ts +++ b/packages/twenty-website/lingui.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from '@lingui/conf'; import { formatter } from '@lingui/format-po'; import { SOURCE_LOCALE } from 'twenty-shared/translations'; -import { WEBSITE_LOCALE_LIST } from './src/lib/i18n/locales'; +import { WEBSITE_LOCALE_LIST } from './src/platform/i18n/website-locale-list'; export default defineConfig({ sourceLocale: SOURCE_LOCALE, diff --git a/packages/twenty-website/next.config.ts b/packages/twenty-website/next.config.ts index 8e660117db..f366dddfa1 100644 --- a/packages/twenty-website/next.config.ts +++ b/packages/twenty-website/next.config.ts @@ -1,72 +1,24 @@ import path from 'path'; import { initOpenNextCloudflareForDev } from '@opennextjs/cloudflare'; import withLinaria, { type LinariaConfig } from 'next-with-linaria'; -import { APP_LOCALES } from 'twenty-shared/translations'; -import { - WEBSITE_LOCALE_LIST, - localeToUrlSegment, -} from './src/lib/i18n/locales'; +import { localeToUrlSegment } from './src/platform/i18n/locale-to-url-segment'; +import { buildLocaleRewrites } from './src/platform/routing/locale-rewrite-patterns'; +import { WEBSITE_LOCALE_LIST } from './src/platform/i18n/website-locale-list'; -// Locale URL segments that are actually served (others are normalised away), -// derived from the single WEBSITE_LOCALE_LIST source of truth so adding a -// locale never requires editing this config. These are exactly the keys of -// LOCALE_BY_URL_SEGMENT in src/lib/i18n/locales.ts. +// Bundler decision: Next 16 defaults dev and build to Turbopack, and +// next-with-linaria@1.3 branches on process.env.TURBOPACK to apply its +// Turbopack loader config — the same combination the original twenty-website +// already runs in dev. Webpack stays available behind `next dev --webpack` +// as the escape hatch if a wyw-in-js edge case surfaces. const DEPLOYED_LOCALE_URL_SEGMENTS = WEBSITE_LOCALE_LIST.map(localeToUrlSegment); -// Raw locale codes (e.g. fr-FR, de-DE) that should redirect to the un-prefixed -// path. Excludes pseudo-* locales and the deployed URL segments themselves. -const RAW_LOCALE_PREFIXES_TO_STRIP = ( - Object.values(APP_LOCALES) as string[] -).filter( - (locale) => - !locale.startsWith('pseudo-') && - !(DEPLOYED_LOCALE_URL_SEGMENTS as readonly string[]).includes(locale), -); - -const SECURITY_HEADERS = [ - { - key: 'Strict-Transport-Security', - value: 'max-age=63072000; includeSubDomains; preload', - }, - { key: 'X-Content-Type-Options', value: 'nosniff' }, - { key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' }, - { - key: 'Permissions-Policy', - value: 'camera=(), microphone=(), geolocation=(), payment=()', - }, - { key: 'X-Frame-Options', value: 'DENY' }, - { key: 'Content-Security-Policy', value: "frame-ancestors 'none'" }, -] as const; - -// Skew protection: CI sets DEPLOYMENT_ID at build time so it's baked into -// prerendered HTML + the RSC payloads. The Worker reads the same value at -// runtime (via the worker env var) and routes mismatched requests to the -// matching older Worker version via its preview URL. -const deploymentId = process.env.DEPLOYMENT_ID; - const nextConfig: LinariaConfig = { - deploymentId, - images: { - formats: ['image/avif', 'image/webp'], - remotePatterns: [ - { - hostname: 'avatars.githubusercontent.com', - pathname: '/**', - protocol: 'https', - }, - { - hostname: 'twenty-icons.com', - pathname: '/**', - protocol: 'https', - }, - ], - }, + reactCompiler: true, linaria: { configFile: path.resolve(__dirname, 'wyw-in-js.config.cjs'), }, - reactCompiler: true, experimental: { swcPlugins: [ [ @@ -80,197 +32,24 @@ const nextConfig: LinariaConfig = { ], ], }, - async headers() { - return [ - { - source: '/:path*', - headers: SECURITY_HEADERS.map((h) => ({ ...h })), - }, - { - source: '/(images|illustrations|lottie)/:path*', - headers: [ - { - key: 'Cache-Control', - value: 'public, max-age=31536000, immutable', - }, - ], - }, - ]; - }, + // Clean public URLs: the source locale is unprefixed, other locales get a + // short segment. Rewrites map unprefixed paths onto the internal /[locale] + // tree; redirects canonicalize away explicit source-locale prefixes. async rewrites() { - const localeAlternation = DEPLOYED_LOCALE_URL_SEGMENTS.join('|'); - return { - beforeFiles: [ - // Root rewrites to the source locale. - { source: '/', destination: '/en' }, - // Multi-segment paths (e.g. /customers/9dots, /articles/my-post). - // The Worker's path-to-regexp does not allow :param(regex) to match - // across "/" boundaries, so we split multi-segment into :first/:rest+. - { - source: `/:first((?!(?:${localeAlternation}|api|_next|images|illustrations|halftone|lottie|fonts)(?=/))[^/.]+)/:rest+`, - destination: '/en/:first/:rest+', - }, - // Single-segment paths (e.g. /pricing, /customers, /why-twenty). - { - source: `/:rest((?!${DEPLOYED_LOCALE_URL_SEGMENTS.map((s) => `${s}$|${s}/`).join('|')}|api|_next/static|_next/image|favicon\\.ico|robots\\.txt|sitemap\\.xml|images|illustrations|lottie|fonts|.+\\..+).+)`, - destination: '/en/:rest', - }, - ], + beforeFiles: buildLocaleRewrites(DEPLOYED_LOCALE_URL_SEGMENTS), }; }, async redirects() { return [ - // Canonicalise www → apex. Host-based; fires before any locale logic. - // The root-path rule must come before the :path* one — Next.js's - // path-to-regexp leaves a literal `:path*` in the Location header - // when the parameter matches empty against an absolute destination. - { - source: '/', - has: [{ type: 'host', value: 'www.twenty.com' }], - destination: 'https://twenty.com/', - permanent: true, - }, - { - source: '/:path*', - has: [{ type: 'host', value: 'www.twenty.com' }], - destination: 'https://twenty.com/:path*', - permanent: true, - }, - { - source: '/', - has: [{ type: 'host', value: 'www.twenty-main.com' }], - destination: 'https://twenty-main.com/', - permanent: true, - }, - { - source: '/:path*', - has: [{ type: 'host', value: 'www.twenty-main.com' }], - destination: 'https://twenty-main.com/:path*', - permanent: true, - }, - // Strip the source-locale prefix: /en/foo → /foo (301). Mirrors proxy.ts Rule 1. { source: '/en', destination: '/', statusCode: 301 }, { source: '/en/:path*', destination: '/:path*', statusCode: 301 }, - // Normalise raw locale codes that aren't deployed URL segments - // (e.g. /fr-FR/foo → /foo, /de-DE/foo → /foo). Mirrors proxy.ts Rule 3. - ...RAW_LOCALE_PREFIXES_TO_STRIP.flatMap((locale) => [ - { source: `/${locale}`, destination: '/', permanent: true }, - { - source: `/${locale}/:path*`, - destination: '/:path*', - permanent: true, - }, - ]), - { - source: '/user-guide', - destination: 'https://docs.twenty.com/user-guide/introduction', - permanent: true, - }, - { - source: '/user-guide/section/:folder/:slug*', - destination: 'https://docs.twenty.com/user-guide/:folder/:slug*', - permanent: true, - }, - { - source: '/user-guide/:folder/:slug*', - destination: 'https://docs.twenty.com/user-guide/:folder/:slug*', - permanent: true, - }, - { - source: '/developers', - destination: 'https://docs.twenty.com/developers/introduction', - permanent: true, - }, - { - source: '/developers/section/:folder/:slug*', - destination: 'https://docs.twenty.com/developers/:folder/:slug*', - permanent: true, - }, - { - source: '/developers/:folder/:slug*', - destination: 'https://docs.twenty.com/developers/:folder/:slug*', - permanent: true, - }, - { - source: '/developers/:slug', - destination: 'https://docs.twenty.com/developers/:slug', - permanent: true, - }, - { - source: '/twenty-ui', - destination: 'https://docs.twenty.com/twenty-ui/introduction', - permanent: true, - }, - { - source: '/twenty-ui/section/:folder/:slug*', - destination: 'https://docs.twenty.com/twenty-ui/:folder/:slug*', - permanent: true, - }, - { - source: '/twenty-ui/:folder/:slug*', - destination: 'https://docs.twenty.com/twenty-ui/:folder/:slug*', - permanent: true, - }, - { - source: '/twenty-ui/:slug', - destination: 'https://docs.twenty.com/twenty-ui/:slug', - permanent: true, - }, - { - source: '/resources/why-twenty', - destination: '/why-twenty', - permanent: true, - }, - { - source: '/story', - destination: '/why-twenty', - permanent: true, - }, - { - source: '/legal/privacy', - destination: '/privacy-policy', - permanent: true, - }, - { - source: '/legal/terms', - destination: '/terms', - permanent: true, - }, - { - source: '/legal/dpa', - destination: '/terms', - permanent: true, - }, - { - source: '/case-studies/9-dots-story', - destination: '/customers/9dots', - permanent: true, - }, - { - source: '/case-studies/act-immi-story', - destination: '/customers/act-education', - permanent: true, - }, - { - source: '/case-studies/:slug*', - destination: '/customers', - permanent: true, - }, - { - source: '/implementation-services', - destination: '/partners', - permanent: true, - }, - { - source: '/onboarding-packages', - destination: '/partners', - permanent: true, - }, ]; }, }; -initOpenNextCloudflareForDev(); +export default withLinaria(nextConfig); -module.exports = withLinaria(nextConfig); +// Binds the Cloudflare dev context (R2 incremental cache, env vars) into +// `next dev` so local runs mirror the deployed OpenNext worker. +initOpenNextCloudflareForDev(); diff --git a/packages/twenty-website/package.json b/packages/twenty-website/package.json index c0bdb18667..5d175b0007 100644 --- a/packages/twenty-website/package.json +++ b/packages/twenty-website/package.json @@ -2,66 +2,52 @@ "name": "twenty-website", "private": true, "scripts": { - "nx": "NX_DEFAULT_PROJECT=twenty-website node ../../node_modules/nx/bin/nx.js", - "generate:releases": "node ./scripts/generate-release-notes-manifest.mjs", "dev": "npx next dev --port 3002", "build": "npx next build", "start": "npx next start --port 3002", - "convert-images": "node ./scripts/convert-png-to-webp.mjs", "preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview", "deploy:dev": "opennextjs-cloudflare build && opennextjs-cloudflare deploy --env dev", "deploy:prod": "opennextjs-cloudflare build && opennextjs-cloudflare deploy --env prod", "cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts" }, "dependencies": { + "@babel/runtime": "^7.27.6", "@base-ui/react": "^1.3.0", - "@base-ui/utils": "^0.2.6", "@calcom/embed-react": "^1.5.3", "@linaria/core": "^7.0.0", "@linaria/react": "^7.0.1", - "@lingui/core": "^5.9.5", - "@lingui/react": "^5.9.5", + "@lingui/core": "^5.1.2", + "@lingui/react": "^5.1.2", "@lottiefiles/dotlottie-react": "^0.18.10", - "@radix-ui/react-popover": "^1.1.15", "@tabler/icons-react": "^3.41.1", "@wyw-in-js/babel-preset": "^0.8.1", - "framer-motion": "^11.18.0", - "gray-matter": "^4.0.3", + "@wyw-in-js/transform": "^0.8.1", "next": "^16.2.6", "next-with-linaria": "^1.3.0", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "react-markdown": "^10.1.0", - "remark-gfm": "^4.0.1", - "serialize-javascript": "^7.0.5", - "sharp": "^0.33.5", + "react": "19.2.3", + "react-dom": "19.2.3", + "server-only": "^0.0.1", "stripe": "^20.3.1", - "three": "^0.183.2", + "three": "^0.184.0", "twenty-shared": "workspace:*", + "twenty-ui": "workspace:*", "zod": "^4.1.11" }, "devDependencies": { - "@lingui/cli": "^5.9.5", - "@lingui/conf": "5.9.5", - "@lingui/format-po": "5.9.5", + "@lingui/cli": "^5.1.2", + "@lingui/conf": "5.1.2", + "@lingui/format-po": "5.1.2", "@lingui/swc-plugin": "^5.11.0", "@opennextjs/cloudflare": "^1.0.0", - "@swc/core": "^1.15.11", - "@swc/jest": "^0.2.39", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/jest": "^30.0.0", "@types/node": "^20", - "@types/react": "^19.2.0", - "@types/react-dom": "^19.2.0", - "@types/serialize-javascript": "^5.0.4", - "@types/three": "^0.183.1", + "@types/react": "^19", + "@types/react-dom": "^19", + "@types/three": "^0.184.1", "babel-plugin-react-compiler": "1.0.0", - "jest": "29.7.0", "jest-environment-jsdom": "30.0.0-beta.3", - "jest-environment-node": "^29.4.1", - "ts-jest": "^29.1.1", "wrangler": "^4.0.0" } } diff --git a/packages/twenty-website/project.json b/packages/twenty-website/project.json index e15c85a025..ca84969c31 100644 --- a/packages/twenty-website/project.json +++ b/packages/twenty-website/project.json @@ -5,128 +5,56 @@ "projectType": "application", "tags": ["scope:website"], "targets": { - "generate-release-manifest": { - "executor": "nx:run-commands", - "cache": true, - "inputs": [ - "{projectRoot}/src/content/releases/**/*", - "{projectRoot}/public/images/releases/**/*", - "{projectRoot}/scripts/generate-release-notes-manifest.mjs" - ], - "outputs": ["{projectRoot}/src/lib/releases/generated-release-notes.ts"], - "options": { - "cwd": "{projectRoot}", - "command": "node scripts/generate-release-notes-manifest.mjs" - } - }, - "build": { - "executor": "nx:run-commands", - "cache": true, - "inputs": ["production", "^production"], - "outputs": ["{projectRoot}/.next"], - "options": { - "cwd": "{projectRoot}", - "command": "npx next build" - }, - "dependsOn": ["generate-release-manifest", "^build"] - }, "dev": { "executor": "nx:run-commands", - "cache": false, - "dependsOn": ["generate-release-manifest"], "options": { "cwd": "{projectRoot}", "command": "npx next dev --port 3002" } }, - "start": { + "build": { "executor": "nx:run-commands", - "cache": false, - "dependsOn": ["build"], "options": { "cwd": "{projectRoot}", - "command": "npx next start --port 3002" + "command": "npx next build" } }, - "check-boundaries": { + "typecheck": { "executor": "nx:run-commands", - "cache": true, - "inputs": [ - "{projectRoot}/src/**/*", - "{projectRoot}/scripts/check-boundaries.mjs" - ], + "dependsOn": ["^build"], "options": { "cwd": "{projectRoot}", - "command": "node scripts/check-boundaries.mjs" + "command": "npx tsc -p tsconfig.json --noEmit" } }, - "check-section-shape": { + "test": { "executor": "nx:run-commands", - "cache": true, - "inputs": [ - "{projectRoot}/src/sections/**/*", - "{projectRoot}/scripts/check-section-shape.mjs" - ], + "dependsOn": ["^build"], "options": { "cwd": "{projectRoot}", - "command": "node scripts/check-section-shape.mjs" - } - }, - "check-lottie-frames": { - "executor": "nx:run-commands", - "cache": true, - "inputs": [ - "{projectRoot}/public/lottie/stepper/stepper.lottie", - "{projectRoot}/src/sections/HomeStepper/utils/home-stepper-lottie-frame-map.ts", - "{projectRoot}/scripts/check-lottie-frames.mjs" - ], - "options": { - "cwd": "{projectRoot}", - "command": "node scripts/check-lottie-frames.mjs" + "command": "npx jest --config=jest.config.mjs" } }, "lint": { "executor": "nx:run-commands", - "cache": true, - "dependsOn": [ - "check-boundaries", - "check-section-shape", - "check-lottie-frames", - "^build", - "twenty-oxlint-rules:build" - ], "options": { "cwd": "{projectRoot}", - "command": "npx oxlint -c .oxlintrc.json . && (npx oxfmt --check . || (echo 'ERROR: oxfmt formatting check failed! Fix with: npx nx run twenty-website:lint --configuration=fix' && false))" + "command": "node scripts/check-conventions.mjs && npx oxlint -c .oxlintrc.json . && npx oxfmt --check ." }, "configurations": { "fix": { - "command": "npx oxlint -c .oxlintrc.json . && npx oxfmt ." + "command": "npx oxfmt ." } - } - }, - "lint:diff-with-main": { - "dependsOn": [ - "check-boundaries", - "check-section-shape", - "check-lottie-frames" - ] - }, - "typecheck": { - "dependsOn": ["generate-release-manifest", "^build"] - }, - "test": {}, - "fmt": { - "options": { - "files": "." }, - "configurations": { - "fix": {} - } + "dependsOn": [ + { + "projects": ["twenty-ui"], + "target": "build" + } + ] }, "lingui:extract": { "executor": "nx:run-commands", - "dependsOn": ["^build"], "options": { "cwd": "{projectRoot}", "command": "lingui extract --overwrite --clean" @@ -134,7 +62,6 @@ }, "lingui:compile": { "executor": "nx:run-commands", - "dependsOn": ["^build"], "options": { "cwd": "{projectRoot}", "command": "lingui compile --typescript" diff --git a/packages/twenty-website/public/halftone/materials/glass/environment.webp b/packages/twenty-website/public/halftone/materials/glass/environment.webp deleted file mode 100644 index cec3a72b4e..0000000000 Binary files a/packages/twenty-website/public/halftone/materials/glass/environment.webp and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/common/faq/faq.glb b/packages/twenty-website/public/illustrations/common/faq/faq.glb deleted file mode 100644 index 1d0f2d0fe4..0000000000 Binary files a/packages/twenty-website/public/illustrations/common/faq/faq.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/common/footer/footer.glb b/packages/twenty-website/public/illustrations/common/footer/footer.glb deleted file mode 100644 index 680e00f939..0000000000 Binary files a/packages/twenty-website/public/illustrations/common/footer/footer.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/generated/home-background-bridge.webp b/packages/twenty-website/public/illustrations/generated/home-background-bridge.webp deleted file mode 100644 index b748599bf4..0000000000 Binary files a/packages/twenty-website/public/illustrations/generated/home-background-bridge.webp and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/generated/home-background-wheat.webp b/packages/twenty-website/public/illustrations/generated/home-background-wheat.webp deleted file mode 100644 index e9ae3047b2..0000000000 Binary files a/packages/twenty-website/public/illustrations/generated/home-background-wheat.webp and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/generated/milestone.webp b/packages/twenty-website/public/illustrations/generated/milestone.webp deleted file mode 100644 index 0321291427..0000000000 Binary files a/packages/twenty-website/public/illustrations/generated/milestone.webp and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/generated/partner-meeting.webp b/packages/twenty-website/public/illustrations/generated/partner-meeting.webp deleted file mode 100644 index b6a104c1b9..0000000000 Binary files a/packages/twenty-website/public/illustrations/generated/partner-meeting.webp and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/helped/money.glb b/packages/twenty-website/public/illustrations/home/helped/money.glb deleted file mode 100644 index 8a30146f0f..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/helped/money.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/helped/spaceship.glb b/packages/twenty-website/public/illustrations/home/helped/spaceship.glb deleted file mode 100644 index 9bb4c642b8..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/helped/spaceship.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/helped/target.glb b/packages/twenty-website/public/illustrations/home/helped/target.glb deleted file mode 100644 index ec45e4068b..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/helped/target.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/testimonials/hourglass.glb b/packages/twenty-website/public/illustrations/home/testimonials/hourglass.glb deleted file mode 100644 index 3ffba3eebc..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/testimonials/hourglass.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/three-cards/diamond.glb b/packages/twenty-website/public/illustrations/home/three-cards/diamond.glb deleted file mode 100644 index 3fe9e48607..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/three-cards/diamond.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/three-cards/flash.glb b/packages/twenty-website/public/illustrations/home/three-cards/flash.glb deleted file mode 100644 index 6570ecff51..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/three-cards/flash.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/home/three-cards/lock.glb b/packages/twenty-website/public/illustrations/home/three-cards/lock.glb deleted file mode 100644 index 6696a8efae..0000000000 Binary files a/packages/twenty-website/public/illustrations/home/three-cards/lock.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/partner/testimonials/quote.glb b/packages/twenty-website/public/illustrations/partner/testimonials/quote.glb deleted file mode 100644 index 394fb7cdac..0000000000 Binary files a/packages/twenty-website/public/illustrations/partner/testimonials/quote.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/partner/three-cards/connect.glb b/packages/twenty-website/public/illustrations/partner/three-cards/connect.glb deleted file mode 100644 index 32d1708c2c..0000000000 Binary files a/packages/twenty-website/public/illustrations/partner/three-cards/connect.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/partner/three-cards/grow.glb b/packages/twenty-website/public/illustrations/partner/three-cards/grow.glb deleted file mode 100644 index 8820922c08..0000000000 Binary files a/packages/twenty-website/public/illustrations/partner/three-cards/grow.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/partner/three-cards/programming.glb b/packages/twenty-website/public/illustrations/partner/three-cards/programming.glb deleted file mode 100644 index 444f32ebcd..0000000000 Binary files a/packages/twenty-website/public/illustrations/partner/three-cards/programming.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/pricing/plan-table/money.glb b/packages/twenty-website/public/illustrations/pricing/plan-table/money.glb deleted file mode 100644 index 8a30146f0f..0000000000 Binary files a/packages/twenty-website/public/illustrations/pricing/plan-table/money.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/product/hero/hero.glb b/packages/twenty-website/public/illustrations/product/hero/hero.glb deleted file mode 100644 index 3ffba3eebc..0000000000 Binary files a/packages/twenty-website/public/illustrations/product/hero/hero.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/product/three-cards/eye.glb b/packages/twenty-website/public/illustrations/product/three-cards/eye.glb deleted file mode 100644 index f086875044..0000000000 Binary files a/packages/twenty-website/public/illustrations/product/three-cards/eye.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/product/three-cards/single-screen.glb b/packages/twenty-website/public/illustrations/product/three-cards/single-screen.glb deleted file mode 100644 index dc8c66e3a9..0000000000 Binary files a/packages/twenty-website/public/illustrations/product/three-cards/single-screen.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/product/three-cards/speed.glb b/packages/twenty-website/public/illustrations/product/three-cards/speed.glb deleted file mode 100644 index 54e7a5a4f2..0000000000 Binary files a/packages/twenty-website/public/illustrations/product/three-cards/speed.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/why-twenty/hero/hero.glb b/packages/twenty-website/public/illustrations/why-twenty/hero/hero.glb deleted file mode 100644 index 2689076090..0000000000 Binary files a/packages/twenty-website/public/illustrations/why-twenty/hero/hero.glb and /dev/null differ diff --git a/packages/twenty-website/public/illustrations/why-twenty/quote/quote.glb b/packages/twenty-website/public/illustrations/why-twenty/quote/quote.glb deleted file mode 100644 index 394fb7cdac..0000000000 Binary files a/packages/twenty-website/public/illustrations/why-twenty/quote/quote.glb and /dev/null differ diff --git a/packages/twenty-website/public/images/customers/case-studies/act-education.webp b/packages/twenty-website/public/images/customers/case-studies/act-education.webp index 119fc93016..cc9544ea33 100644 Binary files a/packages/twenty-website/public/images/customers/case-studies/act-education.webp and b/packages/twenty-website/public/images/customers/case-studies/act-education.webp differ diff --git a/packages/twenty-website/public/images/customers/case-studies/alternative-partners.webp b/packages/twenty-website/public/images/customers/case-studies/alternative-partners.webp index a70dd254f2..f4bdce553a 100644 Binary files a/packages/twenty-website/public/images/customers/case-studies/alternative-partners.webp and b/packages/twenty-website/public/images/customers/case-studies/alternative-partners.webp differ diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/authors/amrendra-singh.webp b/packages/twenty-website/public/images/customers/case-studies/authors/amrendra-singh.webp similarity index 100% rename from packages/twenty-website-redone/public/images/customers/case-studies/authors/amrendra-singh.webp rename to packages/twenty-website/public/images/customers/case-studies/authors/amrendra-singh.webp diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/authors/benjamin-reynolds.webp b/packages/twenty-website/public/images/customers/case-studies/authors/benjamin-reynolds.webp similarity index 100% rename from packages/twenty-website-redone/public/images/customers/case-studies/authors/benjamin-reynolds.webp rename to packages/twenty-website/public/images/customers/case-studies/authors/benjamin-reynolds.webp diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/authors/joseph-chiang.webp b/packages/twenty-website/public/images/customers/case-studies/authors/joseph-chiang.webp similarity index 100% rename from packages/twenty-website-redone/public/images/customers/case-studies/authors/joseph-chiang.webp rename to packages/twenty-website/public/images/customers/case-studies/authors/joseph-chiang.webp diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/authors/mike-babiy.webp b/packages/twenty-website/public/images/customers/case-studies/authors/mike-babiy.webp similarity index 100% rename from packages/twenty-website-redone/public/images/customers/case-studies/authors/mike-babiy.webp rename to packages/twenty-website/public/images/customers/case-studies/authors/mike-babiy.webp diff --git a/packages/twenty-website-redone/public/images/customers/case-studies/authors/olivier-reinaud.webp b/packages/twenty-website/public/images/customers/case-studies/authors/olivier-reinaud.webp similarity index 100% rename from packages/twenty-website-redone/public/images/customers/case-studies/authors/olivier-reinaud.webp rename to packages/twenty-website/public/images/customers/case-studies/authors/olivier-reinaud.webp diff --git a/packages/twenty-website/public/images/customers/case-studies/elevate-consulting.webp b/packages/twenty-website/public/images/customers/case-studies/elevate-consulting.webp index c5dafca72d..616b7e7ec2 100644 Binary files a/packages/twenty-website/public/images/customers/case-studies/elevate-consulting.webp and b/packages/twenty-website/public/images/customers/case-studies/elevate-consulting.webp differ diff --git a/packages/twenty-website/public/images/customers/case-studies/netzero.webp b/packages/twenty-website/public/images/customers/case-studies/netzero.webp index b7ca6ff631..2b1c985a5f 100644 Binary files a/packages/twenty-website/public/images/customers/case-studies/netzero.webp and b/packages/twenty-website/public/images/customers/case-studies/netzero.webp differ diff --git a/packages/twenty-website/public/images/customers/case-studies/nine-dots.webp b/packages/twenty-website/public/images/customers/case-studies/nine-dots.webp index 4024ea48ea..f663a1aca1 100644 Binary files a/packages/twenty-website/public/images/customers/case-studies/nine-dots.webp and b/packages/twenty-website/public/images/customers/case-studies/nine-dots.webp differ diff --git a/packages/twenty-website/public/images/customers/case-studies/w3villa.webp b/packages/twenty-website/public/images/customers/case-studies/w3villa.webp index 7b136cc72a..b8b280e27b 100644 Binary files a/packages/twenty-website/public/images/customers/case-studies/w3villa.webp and b/packages/twenty-website/public/images/customers/case-studies/w3villa.webp differ diff --git a/packages/twenty-website-redone/public/images/halftone/environment.jpg b/packages/twenty-website/public/images/halftone/environment.jpg similarity index 100% rename from packages/twenty-website-redone/public/images/halftone/environment.jpg rename to packages/twenty-website/public/images/halftone/environment.jpg diff --git a/packages/twenty-website-redone/public/images/home/hero-bridge.webp b/packages/twenty-website/public/images/home/hero-bridge.webp similarity index 100% rename from packages/twenty-website-redone/public/images/home/hero-bridge.webp rename to packages/twenty-website/public/images/home/hero-bridge.webp diff --git a/packages/twenty-website/public/images/home/hero/apple-rainbow-logo.svg b/packages/twenty-website/public/images/home/hero/apple-rainbow-logo.svg deleted file mode 100644 index c7767e8a93..0000000000 --- a/packages/twenty-website/public/images/home/hero/apple-rainbow-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/packages/twenty-website/public/images/home/hero/twenty-demo-logo.webp b/packages/twenty-website/public/images/home/hero/twenty-demo-logo.webp deleted file mode 100644 index 436618eb97..0000000000 Binary files a/packages/twenty-website/public/images/home/hero/twenty-demo-logo.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/logo-bar/bayer.webp b/packages/twenty-website/public/images/home/logo-bar/bayer.webp deleted file mode 100644 index 55258e6542..0000000000 Binary files a/packages/twenty-website/public/images/home/logo-bar/bayer.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/logo-bar/civicactions.svg b/packages/twenty-website/public/images/home/logo-bar/civicactions.svg deleted file mode 100644 index cd8a15d68f..0000000000 --- a/packages/twenty-website/public/images/home/logo-bar/civicactions.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/twenty-website/public/images/home/logo-bar/fora.svg b/packages/twenty-website/public/images/home/logo-bar/fora.svg deleted file mode 100644 index 6faf2d6a65..0000000000 --- a/packages/twenty-website/public/images/home/logo-bar/fora.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/packages/twenty-website/public/images/home/logo-bar/french-republic.webp b/packages/twenty-website/public/images/home/logo-bar/french-republic.webp deleted file mode 100644 index fade8f19fa..0000000000 Binary files a/packages/twenty-website/public/images/home/logo-bar/french-republic.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/logo-bar/nic.webp b/packages/twenty-website/public/images/home/logo-bar/nic.webp deleted file mode 100644 index a3ff37cc7c..0000000000 Binary files a/packages/twenty-website/public/images/home/logo-bar/nic.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/logo-bar/others-icon.svg b/packages/twenty-website/public/images/home/logo-bar/others-icon.svg deleted file mode 100644 index e8c14791e3..0000000000 --- a/packages/twenty-website/public/images/home/logo-bar/others-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/twenty-website/public/images/home/logo-bar/otiima.svg b/packages/twenty-website/public/images/home/logo-bar/otiima.svg deleted file mode 100644 index 61d989ee8e..0000000000 --- a/packages/twenty-website/public/images/home/logo-bar/otiima.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/twenty-website/public/images/home/logo-bar/pwc.webp b/packages/twenty-website/public/images/home/logo-bar/pwc.webp deleted file mode 100644 index 3dff470e82..0000000000 Binary files a/packages/twenty-website/public/images/home/logo-bar/pwc.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/logo-bar/shiawase-home.webp b/packages/twenty-website/public/images/home/logo-bar/shiawase-home.webp deleted file mode 100644 index 2a75527727..0000000000 Binary files a/packages/twenty-website/public/images/home/logo-bar/shiawase-home.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/logo-bar/wazoku.svg b/packages/twenty-website/public/images/home/logo-bar/wazoku.svg deleted file mode 100644 index b69fbb2332..0000000000 --- a/packages/twenty-website/public/images/home/logo-bar/wazoku.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/packages/twenty-website/public/images/home/logo-bar/windmill-logo.webp b/packages/twenty-website/public/images/home/logo-bar/windmill-logo.webp deleted file mode 100644 index 9aadf9a4ec..0000000000 Binary files a/packages/twenty-website/public/images/home/logo-bar/windmill-logo.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/stepper/background-shape.webp b/packages/twenty-website/public/images/home/stepper/background-shape.webp deleted file mode 100644 index 266656cc92..0000000000 Binary files a/packages/twenty-website/public/images/home/stepper/background-shape.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/home/stepper/background.webp b/packages/twenty-website/public/images/home/stepper/background.webp deleted file mode 100644 index 72b736b93e..0000000000 Binary files a/packages/twenty-website/public/images/home/stepper/background.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/logo-bar/bayer.webp b/packages/twenty-website/public/images/logo-bar/bayer.webp similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/bayer.webp rename to packages/twenty-website/public/images/logo-bar/bayer.webp diff --git a/packages/twenty-website-redone/public/images/logo-bar/civicactions.svg b/packages/twenty-website/public/images/logo-bar/civicactions.svg similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/civicactions.svg rename to packages/twenty-website/public/images/logo-bar/civicactions.svg diff --git a/packages/twenty-website-redone/public/images/logo-bar/fora.svg b/packages/twenty-website/public/images/logo-bar/fora.svg similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/fora.svg rename to packages/twenty-website/public/images/logo-bar/fora.svg diff --git a/packages/twenty-website-redone/public/images/logo-bar/french-republic.webp b/packages/twenty-website/public/images/logo-bar/french-republic.webp similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/french-republic.webp rename to packages/twenty-website/public/images/logo-bar/french-republic.webp diff --git a/packages/twenty-website-redone/public/images/logo-bar/nic.webp b/packages/twenty-website/public/images/logo-bar/nic.webp similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/nic.webp rename to packages/twenty-website/public/images/logo-bar/nic.webp diff --git a/packages/twenty-website-redone/public/images/logo-bar/otiima.svg b/packages/twenty-website/public/images/logo-bar/otiima.svg similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/otiima.svg rename to packages/twenty-website/public/images/logo-bar/otiima.svg diff --git a/packages/twenty-website-redone/public/images/logo-bar/pwc.webp b/packages/twenty-website/public/images/logo-bar/pwc.webp similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/pwc.webp rename to packages/twenty-website/public/images/logo-bar/pwc.webp diff --git a/packages/twenty-website-redone/public/images/logo-bar/shiawase-home.webp b/packages/twenty-website/public/images/logo-bar/shiawase-home.webp similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/shiawase-home.webp rename to packages/twenty-website/public/images/logo-bar/shiawase-home.webp diff --git a/packages/twenty-website-redone/public/images/logo-bar/wazoku.svg b/packages/twenty-website/public/images/logo-bar/wazoku.svg similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/wazoku.svg rename to packages/twenty-website/public/images/logo-bar/wazoku.svg diff --git a/packages/twenty-website-redone/public/images/logo-bar/windmill-logo.webp b/packages/twenty-website/public/images/logo-bar/windmill-logo.webp similarity index 100% rename from packages/twenty-website-redone/public/images/logo-bar/windmill-logo.webp rename to packages/twenty-website/public/images/logo-bar/windmill-logo.webp diff --git a/packages/twenty-website-redone/public/images/menu/developers.webp b/packages/twenty-website/public/images/menu/developers.webp similarity index 100% rename from packages/twenty-website-redone/public/images/menu/developers.webp rename to packages/twenty-website/public/images/menu/developers.webp diff --git a/packages/twenty-website-redone/public/images/menu/partners.webp b/packages/twenty-website/public/images/menu/partners.webp similarity index 100% rename from packages/twenty-website-redone/public/images/menu/partners.webp rename to packages/twenty-website/public/images/menu/partners.webp diff --git a/packages/twenty-website-redone/public/images/menu/user-guide.webp b/packages/twenty-website/public/images/menu/user-guide.webp similarity index 100% rename from packages/twenty-website-redone/public/images/menu/user-guide.webp rename to packages/twenty-website/public/images/menu/user-guide.webp diff --git a/packages/twenty-website-redone/public/images/menu/why.webp b/packages/twenty-website/public/images/menu/why.webp similarity index 100% rename from packages/twenty-website-redone/public/images/menu/why.webp rename to packages/twenty-website/public/images/menu/why.webp diff --git a/packages/twenty-website/public/images/partner/hero/hero.webp b/packages/twenty-website/public/images/partner/hero/hero.webp deleted file mode 100644 index 418ef9ff08..0000000000 Binary files a/packages/twenty-website/public/images/partner/hero/hero.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/hero/partners-hero.webp b/packages/twenty-website/public/images/partner/hero/partners-hero.webp deleted file mode 100644 index 2c69b76c18..0000000000 Binary files a/packages/twenty-website/public/images/partner/hero/partners-hero.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/testimonials/amrendra-singh.webp b/packages/twenty-website/public/images/partner/testimonials/amrendra-singh.webp deleted file mode 100644 index 7c23601588..0000000000 Binary files a/packages/twenty-website/public/images/partner/testimonials/amrendra-singh.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/testimonials/benjamin-reynolds.webp b/packages/twenty-website/public/images/partner/testimonials/benjamin-reynolds.webp deleted file mode 100644 index 27a549dae2..0000000000 Binary files a/packages/twenty-website/public/images/partner/testimonials/benjamin-reynolds.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/testimonials/bertrams.webp b/packages/twenty-website/public/images/partner/testimonials/bertrams.webp deleted file mode 100644 index f71b5a741c..0000000000 Binary files a/packages/twenty-website/public/images/partner/testimonials/bertrams.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/testimonials/joseph-chiang.webp b/packages/twenty-website/public/images/partner/testimonials/joseph-chiang.webp deleted file mode 100644 index 28acfff234..0000000000 Binary files a/packages/twenty-website/public/images/partner/testimonials/joseph-chiang.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/testimonials/mike-babiy.webp b/packages/twenty-website/public/images/partner/testimonials/mike-babiy.webp deleted file mode 100644 index 1a9d1dd5c0..0000000000 Binary files a/packages/twenty-website/public/images/partner/testimonials/mike-babiy.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/partner/testimonials/olivier-reinaud.webp b/packages/twenty-website/public/images/partner/testimonials/olivier-reinaud.webp deleted file mode 100644 index 51f3d1df5d..0000000000 Binary files a/packages/twenty-website/public/images/partner/testimonials/olivier-reinaud.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/partners/hero/partners-hero.webp b/packages/twenty-website/public/images/partners/hero/partners-hero.webp similarity index 100% rename from packages/twenty-website-redone/public/images/partners/hero/partners-hero.webp rename to packages/twenty-website/public/images/partners/hero/partners-hero.webp diff --git a/packages/twenty-website-redone/public/images/partners/promo/partner-meeting.webp b/packages/twenty-website/public/images/partners/promo/partner-meeting.webp similarity index 100% rename from packages/twenty-website-redone/public/images/partners/promo/partner-meeting.webp rename to packages/twenty-website/public/images/partners/promo/partner-meeting.webp diff --git a/packages/twenty-website-redone/public/images/partners/testimonials/benjamin-reynolds.webp b/packages/twenty-website/public/images/partners/testimonials/benjamin-reynolds.webp similarity index 100% rename from packages/twenty-website-redone/public/images/partners/testimonials/benjamin-reynolds.webp rename to packages/twenty-website/public/images/partners/testimonials/benjamin-reynolds.webp diff --git a/packages/twenty-website-redone/public/images/partners/testimonials/bertrams.webp b/packages/twenty-website/public/images/partners/testimonials/bertrams.webp similarity index 100% rename from packages/twenty-website-redone/public/images/partners/testimonials/bertrams.webp rename to packages/twenty-website/public/images/partners/testimonials/bertrams.webp diff --git a/packages/twenty-website-redone/public/images/partners/testimonials/mike-babiy.webp b/packages/twenty-website/public/images/partners/testimonials/mike-babiy.webp similarity index 100% rename from packages/twenty-website-redone/public/images/partners/testimonials/mike-babiy.webp rename to packages/twenty-website/public/images/partners/testimonials/mike-babiy.webp diff --git a/packages/twenty-website-redone/public/images/pricing/engagement-band/halftone-on-white.webp b/packages/twenty-website/public/images/pricing/engagement-band/halftone-on-white.webp similarity index 100% rename from packages/twenty-website-redone/public/images/pricing/engagement-band/halftone-on-white.webp rename to packages/twenty-website/public/images/pricing/engagement-band/halftone-on-white.webp diff --git a/packages/twenty-website-redone/public/images/pricing/salesfarce/help-icon.webp b/packages/twenty-website/public/images/pricing/salesfarce/help-icon.webp similarity index 100% rename from packages/twenty-website-redone/public/images/pricing/salesfarce/help-icon.webp rename to packages/twenty-website/public/images/pricing/salesfarce/help-icon.webp diff --git a/packages/twenty-website/public/images/pricing/salesforce/help-icon.webp b/packages/twenty-website/public/images/pricing/salesforce/help-icon.webp deleted file mode 100644 index e17531138c..0000000000 Binary files a/packages/twenty-website/public/images/pricing/salesforce/help-icon.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/product/product-hero-background.webp b/packages/twenty-website/public/images/product/product-hero-background.webp similarity index 100% rename from packages/twenty-website-redone/public/images/product/product-hero-background.webp rename to packages/twenty-website/public/images/product/product-hero-background.webp diff --git a/packages/twenty-website/public/images/product/tabs/background-shape.webp b/packages/twenty-website/public/images/product/tabs/background-shape.webp deleted file mode 100644 index 865e2d5220..0000000000 Binary files a/packages/twenty-website/public/images/product/tabs/background-shape.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/product/tabs/background.webp b/packages/twenty-website/public/images/product/tabs/background.webp deleted file mode 100644 index ca0f05b9ed..0000000000 Binary files a/packages/twenty-website/public/images/product/tabs/background.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/releases/0.10/0.10-remote.webp b/packages/twenty-website/public/images/releases/0.10/0.10-remote.webp similarity index 100% rename from packages/twenty-website-redone/public/images/releases/0.10/0.10-remote.webp rename to packages/twenty-website/public/images/releases/0.10/0.10-remote.webp diff --git a/packages/twenty-website/public/images/releases/0.11/0.11-calendar.webp b/packages/twenty-website/public/images/releases/0.11/0.11-calendar.webp index 8ddb6a6fa9..e94ff9e3c9 100644 Binary files a/packages/twenty-website/public/images/releases/0.11/0.11-calendar.webp and b/packages/twenty-website/public/images/releases/0.11/0.11-calendar.webp differ diff --git a/packages/twenty-website/public/images/releases/0.12/0.12-loader.webp b/packages/twenty-website/public/images/releases/0.12/0.12-loader.webp index 67c08e6727..bf16273f51 100644 Binary files a/packages/twenty-website/public/images/releases/0.12/0.12-loader.webp and b/packages/twenty-website/public/images/releases/0.12/0.12-loader.webp differ diff --git a/packages/twenty-website/public/images/releases/0.12/0.12-notifications.webp b/packages/twenty-website/public/images/releases/0.12/0.12-notifications.webp index 712e07af17..c9986e9c86 100644 Binary files a/packages/twenty-website/public/images/releases/0.12/0.12-notifications.webp and b/packages/twenty-website/public/images/releases/0.12/0.12-notifications.webp differ diff --git a/packages/twenty-website/public/images/releases/0.2.3_relations.webp b/packages/twenty-website/public/images/releases/0.2.3_relations.webp index 8f93ff00d0..f0ed2e4fe5 100644 Binary files a/packages/twenty-website/public/images/releases/0.2.3_relations.webp and b/packages/twenty-website/public/images/releases/0.2.3_relations.webp differ diff --git a/packages/twenty-website/public/images/releases/0.20/0.20-onboarding.webp b/packages/twenty-website/public/images/releases/0.20/0.20-onboarding.webp index 6f654d7c31..43bc536e20 100644 Binary files a/packages/twenty-website/public/images/releases/0.20/0.20-onboarding.webp and b/packages/twenty-website/public/images/releases/0.20/0.20-onboarding.webp differ diff --git a/packages/twenty-website/public/images/releases/0.20/0.20-timeline.webp b/packages/twenty-website/public/images/releases/0.20/0.20-timeline.webp index 28fbda8d27..95cd555e3a 100644 Binary files a/packages/twenty-website/public/images/releases/0.20/0.20-timeline.webp and b/packages/twenty-website/public/images/releases/0.20/0.20-timeline.webp differ diff --git a/packages/twenty-website/public/images/releases/0.21/0.21-many-many.webp b/packages/twenty-website/public/images/releases/0.21/0.21-many-many.webp index 989ffd3868..7200508a47 100644 Binary files a/packages/twenty-website/public/images/releases/0.21/0.21-many-many.webp and b/packages/twenty-website/public/images/releases/0.21/0.21-many-many.webp differ diff --git a/packages/twenty-website/public/images/releases/0.23/0.23-created-by.webp b/packages/twenty-website/public/images/releases/0.23/0.23-created-by.webp index c2ba6f84db..0054b6dbaa 100644 Binary files a/packages/twenty-website/public/images/releases/0.23/0.23-created-by.webp and b/packages/twenty-website/public/images/releases/0.23/0.23-created-by.webp differ diff --git a/packages/twenty-website/public/images/releases/0.23/0.23-notes-tasks.webp b/packages/twenty-website/public/images/releases/0.23/0.23-notes-tasks.webp index ee911ecf48..d0df8d8e9a 100644 Binary files a/packages/twenty-website/public/images/releases/0.23/0.23-notes-tasks.webp and b/packages/twenty-website/public/images/releases/0.23/0.23-notes-tasks.webp differ diff --git a/packages/twenty-website/public/images/releases/0.24/0.24-soft-delete.webp b/packages/twenty-website/public/images/releases/0.24/0.24-soft-delete.webp index cf56a2d6f3..5c3087a3bb 100644 Binary files a/packages/twenty-website/public/images/releases/0.24/0.24-soft-delete.webp and b/packages/twenty-website/public/images/releases/0.24/0.24-soft-delete.webp differ diff --git a/packages/twenty-website/public/images/releases/0.3.2_new_layout.webp b/packages/twenty-website/public/images/releases/0.3.2_new_layout.webp index 196dc7dffa..865e6a2341 100644 Binary files a/packages/twenty-website/public/images/releases/0.3.2_new_layout.webp and b/packages/twenty-website/public/images/releases/0.3.2_new_layout.webp differ diff --git a/packages/twenty-website/public/images/releases/0.30/0.30-array-field.webp b/packages/twenty-website/public/images/releases/0.30/0.30-array-field.webp index 4d8006947b..db9ad9d8b8 100644 Binary files a/packages/twenty-website/public/images/releases/0.30/0.30-array-field.webp and b/packages/twenty-website/public/images/releases/0.30/0.30-array-field.webp differ diff --git a/packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.webp b/packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.webp index 0d4848fb6e..d3b72ae731 100644 Binary files a/packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.webp and b/packages/twenty-website/public/images/releases/0.31/0.31-advanced-settings.webp differ diff --git a/packages/twenty-website/public/images/releases/0.34/0.34-subdomains.webp b/packages/twenty-website/public/images/releases/0.34/0.34-subdomains.webp index eb6d962914..85aa3602f8 100644 Binary files a/packages/twenty-website/public/images/releases/0.34/0.34-subdomains.webp and b/packages/twenty-website/public/images/releases/0.34/0.34-subdomains.webp differ diff --git a/packages/twenty-website/public/images/releases/0.35/0.35-Favorites.webp b/packages/twenty-website/public/images/releases/0.35/0.35-Favorites.webp index 4f97a719f9..283626a5ed 100644 Binary files a/packages/twenty-website/public/images/releases/0.35/0.35-Favorites.webp and b/packages/twenty-website/public/images/releases/0.35/0.35-Favorites.webp differ diff --git a/packages/twenty-website/public/images/releases/0.4/0.4-multi-workspace.webp b/packages/twenty-website/public/images/releases/0.4/0.4-multi-workspace.webp index 3bd29ed9a9..c7f72a2706 100644 Binary files a/packages/twenty-website/public/images/releases/0.4/0.4-multi-workspace.webp and b/packages/twenty-website/public/images/releases/0.4/0.4-multi-workspace.webp differ diff --git a/packages/twenty-website/public/images/releases/0.40/0.40-aggregates.webp b/packages/twenty-website/public/images/releases/0.40/0.40-aggregates.webp index cb86afc771..75b6accfd6 100644 Binary files a/packages/twenty-website/public/images/releases/0.40/0.40-aggregates.webp and b/packages/twenty-website/public/images/releases/0.40/0.40-aggregates.webp differ diff --git a/packages/twenty-website/public/images/releases/0.41/0.41-labs.webp b/packages/twenty-website/public/images/releases/0.41/0.41-labs.webp index 540fd28b48..3c2fc9d44f 100644 Binary files a/packages/twenty-website/public/images/releases/0.41/0.41-labs.webp and b/packages/twenty-website/public/images/releases/0.41/0.41-labs.webp differ diff --git a/packages/twenty-website/public/images/releases/0.42/0.42-document-viewer.webp b/packages/twenty-website/public/images/releases/0.42/0.42-document-viewer.webp index f2a4e96638..afc91bc33b 100644 Binary files a/packages/twenty-website/public/images/releases/0.42/0.42-document-viewer.webp and b/packages/twenty-website/public/images/releases/0.42/0.42-document-viewer.webp differ diff --git a/packages/twenty-website/public/images/releases/0.42/0.42-microsoft.webp b/packages/twenty-website/public/images/releases/0.42/0.42-microsoft.webp index b8a8a8b234..c328bac5b9 100644 Binary files a/packages/twenty-website/public/images/releases/0.42/0.42-microsoft.webp and b/packages/twenty-website/public/images/releases/0.42/0.42-microsoft.webp differ diff --git a/packages/twenty-website/public/images/releases/0.42/0.42-translation.webp b/packages/twenty-website/public/images/releases/0.42/0.42-translation.webp index d8d5d68eeb..0446f1d0b5 100644 Binary files a/packages/twenty-website/public/images/releases/0.42/0.42-translation.webp and b/packages/twenty-website/public/images/releases/0.42/0.42-translation.webp differ diff --git a/packages/twenty-website/public/images/releases/0.44/0.44-side-panel.webp b/packages/twenty-website/public/images/releases/0.44/0.44-side-panel.webp index 21b250f5b7..8994228076 100644 Binary files a/packages/twenty-website/public/images/releases/0.44/0.44-side-panel.webp and b/packages/twenty-website/public/images/releases/0.44/0.44-side-panel.webp differ diff --git a/packages/twenty-website/public/images/releases/0.51.0/0.51-options-menu.webp b/packages/twenty-website/public/images/releases/0.51.0/0.51-options-menu.webp index 78e09070fb..85e240ad63 100644 Binary files a/packages/twenty-website/public/images/releases/0.51.0/0.51-options-menu.webp and b/packages/twenty-website/public/images/releases/0.51.0/0.51-options-menu.webp differ diff --git a/packages/twenty-website/public/images/releases/1.00/1.00-import-update.webp b/packages/twenty-website/public/images/releases/1.00/1.00-import-update.webp index c0a1c9d7a6..7669c53ddb 100644 Binary files a/packages/twenty-website/public/images/releases/1.00/1.00-import-update.webp and b/packages/twenty-website/public/images/releases/1.00/1.00-import-update.webp differ diff --git a/packages/twenty-website/public/images/releases/1.00/1.00-permissions.webp b/packages/twenty-website/public/images/releases/1.00/1.00-permissions.webp index 09343bd185..a3e0f21c8c 100644 Binary files a/packages/twenty-website/public/images/releases/1.00/1.00-permissions.webp and b/packages/twenty-website/public/images/releases/1.00/1.00-permissions.webp differ diff --git a/packages/twenty-website/public/images/releases/1.00/1.00-subfield-filtering.webp b/packages/twenty-website/public/images/releases/1.00/1.00-subfield-filtering.webp index ceb9ef741b..0c4e33988c 100644 Binary files a/packages/twenty-website/public/images/releases/1.00/1.00-subfield-filtering.webp and b/packages/twenty-website/public/images/releases/1.00/1.00-subfield-filtering.webp differ diff --git a/packages/twenty-website/public/images/releases/1.13/1.13.0-stop-workflow-button.webp b/packages/twenty-website/public/images/releases/1.13/1.13.0-stop-workflow-button.webp index b087ecad98..18fc466d98 100644 Binary files a/packages/twenty-website/public/images/releases/1.13/1.13.0-stop-workflow-button.webp and b/packages/twenty-website/public/images/releases/1.13/1.13.0-stop-workflow-button.webp differ diff --git a/packages/twenty-website/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp b/packages/twenty-website/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp index 69a079ec02..61fae0e11a 100644 Binary files a/packages/twenty-website/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp and b/packages/twenty-website/public/images/releases/1.14/1.14.0-resize-navbar-and-side-panel.webp differ diff --git a/packages/twenty-website-redone/public/images/releases/1.15/1.15.0-updated-by.webp b/packages/twenty-website/public/images/releases/1.15/1.15.0-updated-by.webp similarity index 100% rename from packages/twenty-website-redone/public/images/releases/1.15/1.15.0-updated-by.webp rename to packages/twenty-website/public/images/releases/1.15/1.15.0-updated-by.webp diff --git a/packages/twenty-website/public/images/releases/1.3/1.3-IMAP.webp b/packages/twenty-website/public/images/releases/1.3/1.3-IMAP.webp index 1d64bb5f52..6263a77305 100644 Binary files a/packages/twenty-website/public/images/releases/1.3/1.3-IMAP.webp and b/packages/twenty-website/public/images/releases/1.3/1.3-IMAP.webp differ diff --git a/packages/twenty-website/public/images/releases/1.3/1.3-merge.webp b/packages/twenty-website/public/images/releases/1.3/1.3-merge.webp index 0a77bfdb74..529721c1ac 100644 Binary files a/packages/twenty-website/public/images/releases/1.3/1.3-merge.webp and b/packages/twenty-website/public/images/releases/1.3/1.3-merge.webp differ diff --git a/packages/twenty-website/public/images/releases/1.4/1.4-two-factor-auth.webp b/packages/twenty-website/public/images/releases/1.4/1.4-two-factor-auth.webp index 7216984dc1..89c9704d65 100644 Binary files a/packages/twenty-website/public/images/releases/1.4/1.4-two-factor-auth.webp and b/packages/twenty-website/public/images/releases/1.4/1.4-two-factor-auth.webp differ diff --git a/packages/twenty-website/public/images/releases/1.7/1.7-impersonating.webp b/packages/twenty-website/public/images/releases/1.7/1.7-impersonating.webp index a8f8415ec9..e6b3c23905 100644 Binary files a/packages/twenty-website/public/images/releases/1.7/1.7-impersonating.webp and b/packages/twenty-website/public/images/releases/1.7/1.7-impersonating.webp differ diff --git a/packages/twenty-website/public/images/releases/2.0/2.0.0-version-control.webp b/packages/twenty-website/public/images/releases/2.0/2.0.0-version-control.webp index da24103014..c67545d38e 100644 Binary files a/packages/twenty-website/public/images/releases/2.0/2.0.0-version-control.webp and b/packages/twenty-website/public/images/releases/2.0/2.0.0-version-control.webp differ diff --git a/packages/twenty-website/public/images/releases/labs/translation.webp b/packages/twenty-website/public/images/releases/labs/translation.webp index 89bd8fce13..4541612e43 100644 Binary files a/packages/twenty-website/public/images/releases/labs/translation.webp and b/packages/twenty-website/public/images/releases/labs/translation.webp differ diff --git a/packages/twenty-website-redone/public/images/releases/milestone.webp b/packages/twenty-website/public/images/releases/milestone.webp similarity index 100% rename from packages/twenty-website-redone/public/images/releases/milestone.webp rename to packages/twenty-website/public/images/releases/milestone.webp diff --git a/packages/twenty-website/public/images/shared/companies/logos/a16z.webp b/packages/twenty-website/public/images/shared/companies/logos/a16z.webp deleted file mode 100644 index 43798acb0f..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/a16z.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/airtable.webp b/packages/twenty-website/public/images/shared/companies/logos/airtable.webp deleted file mode 100644 index 9cfe76536f..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/airtable.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/apple-1977.webp b/packages/twenty-website/public/images/shared/companies/logos/apple-1977.webp deleted file mode 100644 index 131499f5bc..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/apple-1977.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/apple.webp b/packages/twenty-website/public/images/shared/companies/logos/apple.webp deleted file mode 100644 index ce4717bcf6..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/apple.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/calendar.webp b/packages/twenty-website/public/images/shared/companies/logos/calendar.webp deleted file mode 100644 index a9594c9ad0..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/calendar.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/claude.webp b/packages/twenty-website/public/images/shared/companies/logos/claude.webp deleted file mode 100644 index 79640933cb..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/claude.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/docusign.webp b/packages/twenty-website/public/images/shared/companies/logos/docusign.webp deleted file mode 100644 index 20ce247b9f..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/docusign.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/founders-fund.webp b/packages/twenty-website/public/images/shared/companies/logos/founders-fund.webp deleted file mode 100644 index 5affdc758e..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/founders-fund.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/gmail.webp b/packages/twenty-website/public/images/shared/companies/logos/gmail.webp deleted file mode 100644 index 5f7a9a51d6..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/gmail.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/hubspot.webp b/packages/twenty-website/public/images/shared/companies/logos/hubspot.webp deleted file mode 100644 index 795f325e32..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/hubspot.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/kleiner-perkins.webp b/packages/twenty-website/public/images/shared/companies/logos/kleiner-perkins.webp deleted file mode 100644 index 0af40ceb21..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/kleiner-perkins.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/lemlist.webp b/packages/twenty-website/public/images/shared/companies/logos/lemlist.webp deleted file mode 100644 index 01629d282f..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/lemlist.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/meet.webp b/packages/twenty-website/public/images/shared/companies/logos/meet.webp deleted file mode 100644 index 5f07112968..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/meet.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/metabase.webp b/packages/twenty-website/public/images/shared/companies/logos/metabase.webp deleted file mode 100644 index 99acc24b5d..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/metabase.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/microsoft.webp b/packages/twenty-website/public/images/shared/companies/logos/microsoft.webp deleted file mode 100644 index 23c8ed4e74..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/microsoft.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/okta.webp b/packages/twenty-website/public/images/shared/companies/logos/okta.webp deleted file mode 100644 index 143c34354c..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/okta.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/openai.webp b/packages/twenty-website/public/images/shared/companies/logos/openai.webp deleted file mode 100644 index fb836b64be..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/openai.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/outlook.webp b/packages/twenty-website/public/images/shared/companies/logos/outlook.webp deleted file mode 100644 index 37349f0fad..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/outlook.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/outreach.webp b/packages/twenty-website/public/images/shared/companies/logos/outreach.webp deleted file mode 100644 index 139c36dcf5..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/outreach.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/postgresql.webp b/packages/twenty-website/public/images/shared/companies/logos/postgresql.webp deleted file mode 100644 index d73ffe7182..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/postgresql.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/qonto.webp b/packages/twenty-website/public/images/shared/companies/logos/qonto.webp deleted file mode 100644 index adeccdc9e3..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/qonto.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/salesforce.webp b/packages/twenty-website/public/images/shared/companies/logos/salesforce.webp deleted file mode 100644 index 7bd40a416c..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/salesforce.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/segment.webp b/packages/twenty-website/public/images/shared/companies/logos/segment.webp deleted file mode 100644 index f551e54b3a..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/segment.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/tally.webp b/packages/twenty-website/public/images/shared/companies/logos/tally.webp deleted file mode 100644 index f5a3d6fa45..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/tally.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/images/shared/companies/logos/twenty.svg b/packages/twenty-website/public/images/shared/companies/logos/twenty.svg similarity index 100% rename from packages/twenty-website-redone/public/images/shared/companies/logos/twenty.svg rename to packages/twenty-website/public/images/shared/companies/logos/twenty.svg diff --git a/packages/twenty-website/public/images/shared/companies/logos/twenty.webp b/packages/twenty-website/public/images/shared/companies/logos/twenty.webp deleted file mode 100644 index 4873fd10fc..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/twenty.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/whatsapp.webp b/packages/twenty-website/public/images/shared/companies/logos/whatsapp.webp deleted file mode 100644 index ea8ae29045..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/whatsapp.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/companies/logos/zapier.webp b/packages/twenty-website/public/images/shared/companies/logos/zapier.webp deleted file mode 100644 index 8ba68a0424..0000000000 Binary files a/packages/twenty-website/public/images/shared/companies/logos/zapier.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/engagement-band/halftone-on-gray.webp b/packages/twenty-website/public/images/shared/engagement-band/halftone-on-gray.webp deleted file mode 100644 index 97549d13a7..0000000000 Binary files a/packages/twenty-website/public/images/shared/engagement-band/halftone-on-gray.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/engagement-band/halftone-on-white.webp b/packages/twenty-website/public/images/shared/engagement-band/halftone-on-white.webp deleted file mode 100644 index 1cba624d75..0000000000 Binary files a/packages/twenty-website/public/images/shared/engagement-band/halftone-on-white.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/menu/developers-preview.webp b/packages/twenty-website/public/images/shared/menu/developers-preview.webp deleted file mode 100644 index d5048ad9af..0000000000 Binary files a/packages/twenty-website/public/images/shared/menu/developers-preview.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/menu/user-guide-preview.webp b/packages/twenty-website/public/images/shared/menu/user-guide-preview.webp deleted file mode 100644 index 35e119c8e2..0000000000 Binary files a/packages/twenty-website/public/images/shared/menu/user-guide-preview.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/alexandre-prot.webp b/packages/twenty-website/public/images/shared/people/avatars/alexandre-prot.webp deleted file mode 100644 index d10a796443..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/alexandre-prot.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/anonymous-anna.webp b/packages/twenty-website/public/images/shared/people/avatars/anonymous-anna.webp deleted file mode 100644 index 1e1cca7703..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/anonymous-anna.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/anonymous-fabrice.webp b/packages/twenty-website/public/images/shared/people/avatars/anonymous-fabrice.webp deleted file mode 100644 index 0078252829..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/anonymous-fabrice.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/craig-federighi.webp b/packages/twenty-website/public/images/shared/people/avatars/craig-federighi.webp deleted file mode 100644 index 0f03518995..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/craig-federighi.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/phil-schiller.webp b/packages/twenty-website/public/images/shared/people/avatars/phil-schiller.webp deleted file mode 100644 index 922a53bbca..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/phil-schiller.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/sam-altman.webp b/packages/twenty-website/public/images/shared/people/avatars/sam-altman.webp deleted file mode 100644 index 01e10dde70..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/sam-altman.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/steve-anavi.webp b/packages/twenty-website/public/images/shared/people/avatars/steve-anavi.webp deleted file mode 100644 index 9e7e962b9d..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/steve-anavi.webp and /dev/null differ diff --git a/packages/twenty-website/public/images/shared/people/avatars/tim-cook.webp b/packages/twenty-website/public/images/shared/people/avatars/tim-cook.webp deleted file mode 100644 index 8a79b9f3f5..0000000000 Binary files a/packages/twenty-website/public/images/shared/people/avatars/tim-cook.webp and /dev/null differ diff --git a/packages/twenty-website-redone/public/models/diamond.glb b/packages/twenty-website/public/models/diamond.glb similarity index 100% rename from packages/twenty-website-redone/public/models/diamond.glb rename to packages/twenty-website/public/models/diamond.glb diff --git a/packages/twenty-website-redone/public/models/eye.glb b/packages/twenty-website/public/models/eye.glb similarity index 100% rename from packages/twenty-website-redone/public/models/eye.glb rename to packages/twenty-website/public/models/eye.glb diff --git a/packages/twenty-website-redone/public/models/faq.glb b/packages/twenty-website/public/models/faq.glb similarity index 100% rename from packages/twenty-website-redone/public/models/faq.glb rename to packages/twenty-website/public/models/faq.glb diff --git a/packages/twenty-website-redone/public/models/flash.glb b/packages/twenty-website/public/models/flash.glb similarity index 100% rename from packages/twenty-website-redone/public/models/flash.glb rename to packages/twenty-website/public/models/flash.glb diff --git a/packages/twenty-website-redone/public/models/footer.glb b/packages/twenty-website/public/models/footer.glb similarity index 100% rename from packages/twenty-website-redone/public/models/footer.glb rename to packages/twenty-website/public/models/footer.glb diff --git a/packages/twenty-website-redone/public/models/hourglass.glb b/packages/twenty-website/public/models/hourglass.glb similarity index 100% rename from packages/twenty-website-redone/public/models/hourglass.glb rename to packages/twenty-website/public/models/hourglass.glb diff --git a/packages/twenty-website-redone/public/models/lock.glb b/packages/twenty-website/public/models/lock.glb similarity index 100% rename from packages/twenty-website-redone/public/models/lock.glb rename to packages/twenty-website/public/models/lock.glb diff --git a/packages/twenty-website-redone/public/models/money.glb b/packages/twenty-website/public/models/money.glb similarity index 100% rename from packages/twenty-website-redone/public/models/money.glb rename to packages/twenty-website/public/models/money.glb diff --git a/packages/twenty-website-redone/public/models/quote.glb b/packages/twenty-website/public/models/quote.glb similarity index 100% rename from packages/twenty-website-redone/public/models/quote.glb rename to packages/twenty-website/public/models/quote.glb diff --git a/packages/twenty-website-redone/public/models/single-screen.glb b/packages/twenty-website/public/models/single-screen.glb similarity index 100% rename from packages/twenty-website-redone/public/models/single-screen.glb rename to packages/twenty-website/public/models/single-screen.glb diff --git a/packages/twenty-website-redone/public/models/spaceship.glb b/packages/twenty-website/public/models/spaceship.glb similarity index 100% rename from packages/twenty-website-redone/public/models/spaceship.glb rename to packages/twenty-website/public/models/spaceship.glb diff --git a/packages/twenty-website-redone/public/models/speed.glb b/packages/twenty-website/public/models/speed.glb similarity index 100% rename from packages/twenty-website-redone/public/models/speed.glb rename to packages/twenty-website/public/models/speed.glb diff --git a/packages/twenty-website-redone/public/models/target.glb b/packages/twenty-website/public/models/target.glb similarity index 100% rename from packages/twenty-website-redone/public/models/target.glb rename to packages/twenty-website/public/models/target.glb diff --git a/packages/twenty-website-redone/public/models/why-twenty-hero.glb b/packages/twenty-website/public/models/why-twenty-hero.glb similarity index 100% rename from packages/twenty-website-redone/public/models/why-twenty-hero.glb rename to packages/twenty-website/public/models/why-twenty-hero.glb diff --git a/packages/twenty-website-redone/scripts/background-cap.mjs b/packages/twenty-website/scripts/background-cap.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/background-cap.mjs rename to packages/twenty-website/scripts/background-cap.mjs diff --git a/packages/twenty-website-redone/scripts/battery-kit.mjs b/packages/twenty-website/scripts/battery-kit.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/battery-kit.mjs rename to packages/twenty-website/scripts/battery-kit.mjs diff --git a/packages/twenty-website/scripts/check-boundaries.mjs b/packages/twenty-website/scripts/check-boundaries.mjs deleted file mode 100644 index 7224db7bdb..0000000000 --- a/packages/twenty-website/scripts/check-boundaries.mjs +++ /dev/null @@ -1,278 +0,0 @@ -#!/usr/bin/env node -import fs from 'node:fs/promises'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const ROOT = path.resolve(__dirname, '..'); -const SRC = path.join(ROOT, 'src'); - -const KNOWN_VIOLATIONS = new Set([]); - -const ALLOW_DIRECTIVE_REGEX = - /\/\/\s*boundary-allow-next-line:([\w-]+)(?:\s+--\s+.+)?/; - -const RULES = [ - { - id: 'no-raw-webgl-renderer', - description: - '`new THREE.WebGLRenderer(...)` may only be instantiated inside `src/lib/visual-runtime/`.', - pattern: /new\s+(?:THREE\.)?WebGLRenderer\s*\(/, - appliesTo: (rel) => - rel.startsWith('src/') && /\.(ts|tsx|mjs|js|jsx)$/.test(rel), - exempt: (rel) => - rel.startsWith('src/lib/visual-runtime/') || - rel.includes('__tests__') || - rel.endsWith('.d.ts'), - help: [ - 'Use `createSiteWebGlRenderer` from `@/lib/visual-runtime/create-site-webgl-renderer`', - 'instead. The factory enforces the site-wide context cap, attaches the kill', - 'switch (NEXT_PUBLIC_DISABLE_HEAVY_VISUALS), and centralises GPU / power', - 'preference defaults.', - ].join('\n '), - }, - { - id: 'no-raw-animation-frame', - description: - '`requestAnimationFrame(...)` / `cancelAnimationFrame(...)` may only be used inside shared runtime primitives.', - pattern: - /\b(?:window\.)?(?:requestAnimationFrame|cancelAnimationFrame)\s*\(/, - appliesTo: (rel) => - rel.startsWith('src/') && /\.(ts|tsx|mjs|js|jsx)$/.test(rel), - exempt: (rel) => - rel.startsWith('src/lib/animation/') || - rel.startsWith('src/lib/visual-runtime/') || - rel.includes('__tests__') || - rel === 'src/app/[locale]/halftone/_lib/exporters.ts' || - rel.endsWith('.d.ts'), - help: [ - 'Use `createAnimationFrameLoop` from `@/lib/animation` for one-shot', - 'or UI frame scheduling. Use `createVisualRenderLoop` from', - '`@/lib/visual-runtime` for canvas/WebGL renderers so tab visibility,', - 'element visibility, cleanup, and render failures are handled consistently.', - ].join('\n '), - }, - { - id: 'design-system-no-upward-import', - description: - 'design-system is the lowest UI layer — it must not import from @/sections, @/templates, or @/app.', - pattern: /from\s+['"]@\/(sections|templates|app)(\/|['"])/, - appliesTo: (rel) => - rel.startsWith('src/design-system/') && /\.(ts|tsx)$/.test(rel), - exempt: (rel) => rel.includes('__tests__') || rel.endsWith('.d.ts'), - help: [ - 'design-system holds atomic, domain-agnostic primitives. It may depend on', - '@/theme, @/icons and @/lib, but never on the higher layers (sections,', - 'templates, app). If a primitive needs section/page data, lift that data up', - 'to the consumer and pass it in as a prop.', - ].join('\n '), - }, - { - id: 'templates-no-upward-import', - description: - 'templates (section layout shells) must not import from @/sections or @/app — only @/design-system and @/theme.', - pattern: /from\s+['"]@\/(sections|app)(\/|['"])/, - appliesTo: (rel) => - rel.startsWith('src/templates/') && /\.(ts|tsx)$/.test(rel), - exempt: (rel) => rel.includes('__tests__') || rel.endsWith('.d.ts'), - help: [ - 'templates are reusable section layout shells composed from design-system', - 'primitives. They must not reach into sections (visuals) or app (pages).', - 'Page-local blocks compose a template with its section visual — inject the', - 'visual as children/a prop rather than importing it into the template.', - ].join('\n '), - }, -]; - -const SKIP_DIRS = new Set([ - 'node_modules', - '.next', - '.turbo', - 'dist', - 'build', - 'storybook-static', - 'public', - '.git', -]); - -async function* walk(dir) { - const entries = await fs.readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - if (entry.isDirectory()) { - if (SKIP_DIRS.has(entry.name)) continue; - yield* walk(path.join(dir, entry.name)); - } else if (entry.isFile()) { - yield path.join(dir, entry.name); - } - } -} - -function findMatches(contents, pattern, ruleId) { - const matches = []; - const directives = []; - const lines = contents.split('\n'); - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - - const directiveMatch = line.match(ALLOW_DIRECTIVE_REGEX); - if (directiveMatch && directiveMatch[1] === ruleId) { - directives.push({ line: i + 1, ruleId, suppressed: false }); - } - - const m = line.match(pattern); - if (m && m.index != null) { - const prevDirective = directives.find((d) => d.line === i); - const suppressed = prevDirective !== undefined; - if (prevDirective) prevDirective.suppressed = true; - matches.push({ - line: i + 1, - column: m.index + 1, - snippet: line.trim(), - suppressed, - }); - } - } - return { matches, directives }; -} - -async function main() { - const violations = []; - const staleDirectives = []; - - for await (const absPath of walk(SRC)) { - const rel = path.relative(ROOT, absPath).split(path.sep).join('/'); - - for (const rule of RULES) { - if (!rule.appliesTo(rel)) continue; - if (rule.exempt(rel)) continue; - - let contents; - try { - contents = await fs.readFile(absPath, 'utf8'); - } catch { - continue; - } - - const { matches, directives } = findMatches( - contents, - rule.pattern, - rule.id, - ); - for (const m of matches) { - if (m.suppressed) continue; - violations.push({ - rule, - file: rel, - line: m.line, - column: m.column, - snippet: m.snippet, - }); - } - for (const d of directives) { - if (!d.suppressed) { - staleDirectives.push({ rule, file: rel, line: d.line }); - } - } - } - } - - const newViolations = []; - const seenKnown = new Set(); - - for (const v of violations) { - const key = `${v.rule.id}:${v.file}`; - if (KNOWN_VIOLATIONS.has(key)) { - seenKnown.add(key); - } else { - newViolations.push(v); - } - } - - const staleKnown = []; - for (const key of KNOWN_VIOLATIONS) { - if (!seenKnown.has(key)) staleKnown.push(key); - } - - let exitCode = 0; - - if (newViolations.length > 0) { - exitCode = 1; - const byRule = new Map(); - for (const v of newViolations) { - if (!byRule.has(v.rule.id)) byRule.set(v.rule.id, []); - byRule.get(v.rule.id).push(v); - } - - console.error(''); - console.error( - `\u001b[31mcheck-boundaries: ${newViolations.length} new violation(s) found\u001b[0m`, - ); - console.error(''); - - for (const [ruleId, list] of byRule.entries()) { - const rule = list[0].rule; - console.error(`\u001b[1m${ruleId}\u001b[0m — ${rule.description}`); - console.error(''); - for (const v of list) { - console.error(` ${v.file}:${v.line}:${v.column}`); - console.error(` > ${v.snippet}`); - } - console.error(''); - console.error(` help:`); - console.error(` ${rule.help}`); - console.error(''); - } - } - - if (staleKnown.length > 0) { - exitCode = 1; - console.error(''); - console.error( - `\u001b[31mcheck-boundaries: ${staleKnown.length} stale entry/entries in KNOWN_VIOLATIONS\u001b[0m`, - ); - console.error( - ' Remove the following from KNOWN_VIOLATIONS in scripts/check-boundaries.mjs:', - ); - console.error(''); - for (const key of staleKnown) { - console.error(` - ${key}`); - } - console.error(''); - } - - if (staleDirectives.length > 0) { - exitCode = 1; - console.error(''); - console.error( - `\u001b[31mcheck-boundaries: ${staleDirectives.length} stale boundary-allow-next-line directive(s)\u001b[0m`, - ); - console.error( - ' The directive on these lines no longer suppresses any violation. Remove it:', - ); - console.error(''); - for (const d of staleDirectives) { - console.error(` - ${d.file}:${d.line} (${d.rule.id})`); - } - console.error(''); - } - - if (exitCode === 0) { - if (KNOWN_VIOLATIONS.size > 0) { - console.error( - `check-boundaries: OK (${KNOWN_VIOLATIONS.size} grandfathered file-level violation(s) tolerated; drive to zero).`, - ); - } else { - console.error('check-boundaries: OK'); - } - } - - return exitCode; -} - -main() - .then((code) => process.exit(code)) - .catch((err) => { - console.error('check-boundaries: unexpected error'); - console.error(err); - process.exit(2); - }); diff --git a/packages/twenty-website-redone/scripts/check-conventions.mjs b/packages/twenty-website/scripts/check-conventions.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/check-conventions.mjs rename to packages/twenty-website/scripts/check-conventions.mjs diff --git a/packages/twenty-website/scripts/check-lottie-frames.mjs b/packages/twenty-website/scripts/check-lottie-frames.mjs deleted file mode 100644 index 1ef4821b63..0000000000 --- a/packages/twenty-website/scripts/check-lottie-frames.mjs +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env node -import { execFile } from 'node:child_process'; -import { readFile } from 'node:fs/promises'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { promisify } from 'node:util'; - -const execFileAsync = promisify(execFile); - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const ROOT = path.resolve(__dirname, '..'); - -const LOTTIE_PATH = path.join( - ROOT, - 'public', - 'lottie', - 'stepper', - 'stepper.lottie', -); -const ANIMATION_ENTRY = 'animations/main.json'; -const FRAME_MAP_PATH = path.join( - ROOT, - 'src', - 'sections', - 'HomeStepper', - 'components', - 'Visual', - 'use-dot-lottie-scroll-sync.ts', -); - -const EXPECTED_CONSTANT_REGEX = - /(?:export\s+)?const\s+HOME_STEPPER_LOTTIE_EXPECTED_TOTAL_FRAMES\s*=\s*(\d+)\s*;/; - -function fail(message) { - // eslint-disable-next-line no-console - console.error(`\n check-lottie-frames: ${message}\n`); - process.exitCode = 1; -} - -async function readExpectedTotalFrames() { - const source = await readFile(FRAME_MAP_PATH, 'utf8'); - const match = source.match(EXPECTED_CONSTANT_REGEX); - if (match === null) { - throw new Error( - `couldn't find HOME_STEPPER_LOTTIE_EXPECTED_TOTAL_FRAMES in ${path.relative(ROOT, FRAME_MAP_PATH)}. ` + - 'Has the constant been renamed? Update both the TS file and the regex in this script.', - ); - } - return Number.parseInt(match[1], 10); -} - -async function readActualTotalFrames() { - let stdout; - try { - const result = await execFileAsync( - 'unzip', - ['-p', LOTTIE_PATH, ANIMATION_ENTRY], - { maxBuffer: 32 * 1024 * 1024, encoding: 'buffer' }, - ); - stdout = result.stdout; - } catch (error) { - if (error?.code === 'ENOENT') { - throw new Error( - '`unzip` binary not found on PATH. Install it (Debian/Ubuntu: `apt install unzip`, macOS ships with it) — ' + - 'this script needs it to read the Lottie animation JSON.', - ); - } - throw new Error( - `failed to extract ${ANIMATION_ENTRY} from ${path.relative(ROOT, LOTTIE_PATH)}: ${error?.message ?? error}`, - ); - } - - let animation; - try { - animation = JSON.parse(stdout.toString('utf8')); - } catch (error) { - throw new Error( - `${ANIMATION_ENTRY} inside the .lottie file is not valid JSON: ${error?.message ?? error}`, - ); - } - - const ip = animation?.ip; - const op = animation?.op; - if (typeof ip !== 'number' || typeof op !== 'number') { - throw new Error( - `${ANIMATION_ENTRY} is missing numeric \`ip\` / \`op\` fields ` + - `(got ip=${JSON.stringify(ip)}, op=${JSON.stringify(op)}). ` + - 'Has the Lottie schema changed?', - ); - } - return Math.floor(op - ip); -} - -async function main() { - const [expected, actual] = await Promise.all([ - readExpectedTotalFrames(), - readActualTotalFrames(), - ]); - - if (expected !== actual) { - fail( - `Lottie totalFrames mismatch — expected ${expected} (per HOME_STEPPER_LOTTIE_EXPECTED_TOTAL_FRAMES), ` + - `got ${actual} from ${path.relative(ROOT, LOTTIE_PATH)}.\n ` + - ' The home-stepper scroll → frame map is keyed to the authored timeline; ' + - 'either:\n 1. revert the Lottie re-export, or\n 2. update HOME_STEPPER_LOTTIE_EXPECTED_TOTAL_FRAMES ' + - 'and the STEP_*_END anchors in home-stepper-lottie-frame-map.ts together.', - ); - return; - } - - // eslint-disable-next-line no-console - console.log( - `check-lottie-frames: OK (stepper.lottie totalFrames = ${actual}).`, - ); -} - -main().catch((error) => { - fail(error?.message ?? String(error)); -}); diff --git a/packages/twenty-website/scripts/check-section-shape.mjs b/packages/twenty-website/scripts/check-section-shape.mjs deleted file mode 100644 index 6c829acd7e..0000000000 --- a/packages/twenty-website/scripts/check-section-shape.mjs +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env node -import fs from 'node:fs/promises'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const ROOT = path.resolve(__dirname, '..'); -const SECTIONS_DIR = path.join(ROOT, 'src', 'sections'); - -const LEAF_SECTIONS = new Set([ - 'CaseStudy', - 'CaseStudyCatalog', - 'ContactCal', - 'LegalDocument', - 'PartnerApplication', - 'Stepper', - // Visual-only modules: their layout shells moved to src/templates/, so they - // no longer own a section — they just expose visual components. - 'Hero', - 'ThreeCards', - 'Testimonials', -]); - -async function listSections() { - const entries = await fs.readdir(SECTIONS_DIR, { withFileTypes: true }); - return entries - .filter((entry) => entry.isDirectory()) - .map((entry) => entry.name) - .sort(); -} - -async function fileExists(absPath) { - try { - await fs.stat(absPath); - return true; - } catch { - return false; - } -} - -async function readFileOrNull(absPath) { - try { - return await fs.readFile(absPath, 'utf8'); - } catch { - return null; - } -} - -async function findBarrel(sectionDir) { - const candidates = [ - path.join(sectionDir, 'components', 'index.ts'), - path.join(sectionDir, 'components', 'index.tsx'), - path.join(sectionDir, 'index.ts'), - path.join(sectionDir, 'index.tsx'), - ]; - for (const candidate of candidates) { - if (await fileExists(candidate)) return candidate; - } - return null; -} - -async function findRoot(sectionDir) { - const sectionName = path.basename(sectionDir); - const candidates = [ - // Legacy compound sections own the
in components/Root.tsx. - path.join(sectionDir, 'components', 'Root.tsx'), - // Single-file sections own it in
.tsx (e.g. TrustedBy/TrustedBy.tsx). - path.join(sectionDir, `${sectionName}.tsx`), - path.join(sectionDir, `${sectionName}.ts`), - // Flat-primitive sections own it in a
Section shell - // (e.g. Hero/components/HeroSection.tsx) consumed by page-local blocks. - path.join(sectionDir, 'components', `${sectionName}Section.tsx`), - ]; - for (const candidate of candidates) { - if (await fileExists(candidate)) return candidate; - } - return null; -} - -const TOARRAY_REGEX = /Children\.toArray\s*\(/; - -function stripComments(source) { - let out = source.replace(/\/\*[\s\S]*?\*\//g, ''); - out = out.replace(/(^|[^:])\/\/[^\n]*/g, '$1'); - return out; -} - -async function checkSection(name) { - const sectionDir = path.join(SECTIONS_DIR, name); - const violations = []; - - const barrel = await findBarrel(sectionDir); - if (barrel === null) { - violations.push( - `${name}: missing a barrel (index.{ts,tsx}) — every section must expose its public API through one barrel (flat named exports; no compound objects).`, - ); - return violations; - } - - if (LEAF_SECTIONS.has(name)) return violations; - - const root = await findRoot(sectionDir); - if (root === null) { - violations.push( - `${name}: missing components/Root.tsx — every section needs a Root that owns the outer
element.`, - ); - } else { - const rootContents = await readFileOrNull(root); - if ( - rootContents !== null && - TOARRAY_REGEX.test(stripComments(rootContents)) - ) { - violations.push( - `${name}: components/Root.tsx uses Children.toArray(...) positional indexing — match slots by displayName instead (see TrustedBy.Root for the pattern).`, - ); - } - } - - return violations; -} - -async function main() { - const sections = await listSections(); - const allViolations = []; - for (const name of sections) { - const sectionViolations = await checkSection(name); - for (const v of sectionViolations) allViolations.push(v); - } - - if (allViolations.length === 0) { - console.error( - `check-section-shape: OK (${sections.length} sections inspected).`, - ); - return 0; - } - - console.error(''); - console.error( - `\u001b[31mcheck-section-shape: ${allViolations.length} violation(s)\u001b[0m`, - ); - console.error(''); - for (const v of allViolations) { - console.error(` - ${v}`); - } - console.error(''); - return 1; -} - -main() - .then((code) => process.exit(code)) - .catch((err) => { - console.error('check-section-shape: unexpected error'); - console.error(err); - process.exit(2); - }); diff --git a/packages/twenty-website-redone/scripts/check-visual-bundle.mjs b/packages/twenty-website/scripts/check-visual-bundle.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/check-visual-bundle.mjs rename to packages/twenty-website/scripts/check-visual-bundle.mjs diff --git a/packages/twenty-website/scripts/convert-png-to-webp.mjs b/packages/twenty-website/scripts/convert-png-to-webp.mjs deleted file mode 100644 index 520dcd86c8..0000000000 --- a/packages/twenty-website/scripts/convert-png-to-webp.mjs +++ /dev/null @@ -1,56 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { fileURLToPath } from 'url'; - -import sharp from 'sharp'; - -const __dirname = path.dirname(fileURLToPath(import.meta.url)); -const imagesRoot = path.join(__dirname, '..', 'public', 'images'); - -const CONVERTIBLE_EXTENSIONS = /\.(png|jpe?g)$/i; - -let totalBefore = 0; -let totalAfter = 0; -let count = 0; - -async function walkAndConvert(directoryPath) { - for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) { - const fullPath = path.join(directoryPath, entry.name); - - if (entry.isDirectory()) { - await walkAndConvert(fullPath); - continue; - } - - if (!CONVERTIBLE_EXTENSIONS.test(entry.name)) { - continue; - } - - const outputPath = fullPath.replace(CONVERTIBLE_EXTENSIONS, '.webp'); - const beforeSize = fs.statSync(fullPath).size; - - await sharp(fullPath).webp({ quality: 92 }).toFile(outputPath); - - const afterSize = fs.statSync(outputPath).size; - - fs.unlinkSync(fullPath); - - totalBefore += beforeSize; - totalAfter += afterSize; - count++; - - const saved = (((beforeSize - afterSize) / beforeSize) * 100).toFixed(1); - const rel = path.relative(imagesRoot, outputPath); - console.log( - `${rel} ${(beforeSize / 1024).toFixed(0)} KB -> ${(afterSize / 1024).toFixed(0)} KB (${saved}% saved)`, - ); - } -} - -await walkAndConvert(imagesRoot); - -console.log(''); -console.log(`Converted ${count} files`); -console.log( - `Total: ${(totalBefore / 1048576).toFixed(2)} MiB -> ${(totalAfter / 1048576).toFixed(2)} MiB (${(((totalBefore - totalAfter) / totalBefore) * 100).toFixed(1)}% saved)`, -); diff --git a/packages/twenty-website/scripts/generate-release-notes-manifest.mjs b/packages/twenty-website/scripts/generate-release-notes-manifest.mjs deleted file mode 100644 index 102f66093b..0000000000 --- a/packages/twenty-website/scripts/generate-release-notes-manifest.mjs +++ /dev/null @@ -1,214 +0,0 @@ -import fs from 'fs'; -import path from 'path'; - -import matter from 'gray-matter'; - -const projectRoot = path.resolve(import.meta.dirname, '..'); -const releasesDirectory = path.join(projectRoot, 'src', 'content', 'releases'); -const outputPath = path.join( - projectRoot, - 'src', - 'lib', - 'releases', - 'generated-release-notes.ts', -); - -const headingRegex = /^\s*#\s+(.+?)\s*$/m; -const imageRegex = /!\[[^\]]*\]\(([^)]+)\)/; - -function normalizeFrontmatterDate(dateValue) { - if (typeof dateValue === 'string') { - return dateValue; - } - - if (dateValue instanceof Date && !Number.isNaN(dateValue.getTime())) { - return dateValue.toISOString().slice(0, 10); - } - - return ''; -} - -function compareSemanticVersions(a, b) { - return compareParsed(parseSemver(a), parseSemver(b)); -} - -function parseSemver(version) { - const trimmed = version.trim().replace(/^v/i, ''); - const withoutBuild = trimmed.split('+', 1)[0] ?? ''; - const dashIndex = withoutBuild.indexOf('-'); - const coreString = - dashIndex === -1 ? withoutBuild : withoutBuild.slice(0, dashIndex); - const preString = dashIndex === -1 ? null : withoutBuild.slice(dashIndex + 1); - const core = coreString.split('.').map((part) => { - const parsed = Number.parseInt(part, 10); - return Number.isFinite(parsed) ? parsed : 0; - }); - - return { - core, - pre: preString === null || preString === '' ? null : preString.split('.'), - }; -} - -function compareParsed(a, b) { - const length = Math.max(a.core.length, b.core.length); - - for (let index = 0; index < length; index += 1) { - const left = a.core[index] ?? 0; - const right = b.core[index] ?? 0; - - if (left !== right) { - return left < right ? -1 : 1; - } - } - - if (a.pre === null && b.pre === null) { - return 0; - } - - if (a.pre === null) { - return 1; - } - - if (b.pre === null) { - return -1; - } - - const prereleaseLength = Math.min(a.pre.length, b.pre.length); - - for (let index = 0; index < prereleaseLength; index += 1) { - const left = a.pre[index] ?? ''; - const right = b.pre[index] ?? ''; - const leftIsNumeric = /^\d+$/.test(left); - const rightIsNumeric = /^\d+$/.test(right); - - if (leftIsNumeric && rightIsNumeric) { - const leftNumber = Number.parseInt(left, 10); - const rightNumber = Number.parseInt(right, 10); - - if (leftNumber !== rightNumber) { - return leftNumber < rightNumber ? -1 : 1; - } - - continue; - } - - if (leftIsNumeric) { - return -1; - } - - if (rightIsNumeric) { - return 1; - } - - if (left !== right) { - return left < right ? -1 : 1; - } - } - - if (a.pre.length === b.pre.length) { - return 0; - } - - return a.pre.length < b.pre.length ? -1 : 1; -} - -function inferTitle(content) { - const match = content.match(headingRegex); - return match?.[1]?.trim() ?? ''; -} - -function inferPreviewImage(content) { - const match = content.match(imageRegex); - return match?.[1]?.trim() ?? ''; -} - -function readReleaseNotes() { - const fileNames = fs - .readdirSync(releasesDirectory) - .filter( - (fileName) => fileName.endsWith('.md') || fileName.endsWith('.mdx'), - ); - - const notes = fileNames.map((fileName) => { - const fullPath = path.join(releasesDirectory, fileName); - const raw = fs.readFileSync(fullPath, 'utf8'); - const { data, content } = matter(raw); - const release = typeof data.release === 'string' ? data.release.trim() : ''; - const date = normalizeFrontmatterDate(data.Date ?? data.date); - const title = - typeof data.title === 'string' && data.title.trim() - ? data.title.trim() - : inferTitle(content); - const previewImage = - typeof data.previewImage === 'string' && data.previewImage.trim() - ? data.previewImage.trim() - : inferPreviewImage(content); - - if (!release) { - throw new Error(`Missing "release" frontmatter in ${fileName}`); - } - - if (!title) { - throw new Error( - `Missing release title in ${fileName}. Add "title" frontmatter or a top-level markdown heading.`, - ); - } - - if (!previewImage) { - throw new Error( - `Missing preview image in ${fileName}. Add "previewImage" frontmatter or a markdown image.`, - ); - } - - const imagePath = path.join( - projectRoot, - 'public', - previewImage.replace(/^\//, ''), - ); - - if (!fs.existsSync(imagePath)) { - throw new Error( - `Preview image "${previewImage}" referenced by ${fileName} was not found in public/.`, - ); - } - - return { - slug: fileName.replace(/\.mdx?$/i, ''), - date, - release, - title, - previewImage, - content, - }; - }); - - notes.sort((left, right) => - compareSemanticVersions(right.release, left.release), - ); - - return notes; -} - -function buildFileContent(notes) { - const serializedNotes = JSON.stringify(notes, null, 2); - - return `/* eslint-disable */ -// This file is auto-generated by scripts/generate-release-notes-manifest.mjs. -// Do not edit it manually. - -import type { LocalReleaseNote } from './types'; - -export const GENERATED_RELEASE_NOTES: LocalReleaseNote[] = ${serializedNotes} as LocalReleaseNote[]; -`; -} - -function main() { - const notes = readReleaseNotes(); - fs.writeFileSync(outputPath, buildFileContent(notes)); - process.stdout.write( - `Generated release manifest with ${notes.length} entries at ${path.relative(projectRoot, outputPath)}\n`, - ); -} - -main(); diff --git a/packages/twenty-website-redone/scripts/lcp-report.mjs b/packages/twenty-website/scripts/lcp-report.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/lcp-report.mjs rename to packages/twenty-website/scripts/lcp-report.mjs diff --git a/packages/twenty-website-redone/scripts/locks/home.json b/packages/twenty-website/scripts/locks/home.json similarity index 100% rename from packages/twenty-website-redone/scripts/locks/home.json rename to packages/twenty-website/scripts/locks/home.json diff --git a/packages/twenty-website-redone/scripts/locks/product.json b/packages/twenty-website/scripts/locks/product.json similarity index 100% rename from packages/twenty-website-redone/scripts/locks/product.json rename to packages/twenty-website/scripts/locks/product.json diff --git a/packages/twenty-website-redone/scripts/mockup-old-parity.mjs b/packages/twenty-website/scripts/mockup-old-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/mockup-old-parity.mjs rename to packages/twenty-website/scripts/mockup-old-parity.mjs diff --git a/packages/twenty-website-redone/scripts/page-lock.mjs b/packages/twenty-website/scripts/page-lock.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/page-lock.mjs rename to packages/twenty-website/scripts/page-lock.mjs diff --git a/packages/twenty-website-redone/scripts/partners-parity.mjs b/packages/twenty-website/scripts/partners-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/partners-parity.mjs rename to packages/twenty-website/scripts/partners-parity.mjs diff --git a/packages/twenty-website-redone/scripts/pending-visual-slots.mjs b/packages/twenty-website/scripts/pending-visual-slots.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/pending-visual-slots.mjs rename to packages/twenty-website/scripts/pending-visual-slots.mjs diff --git a/packages/twenty-website-redone/scripts/pricing-plans-parity.mjs b/packages/twenty-website/scripts/pricing-plans-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/pricing-plans-parity.mjs rename to packages/twenty-website/scripts/pricing-plans-parity.mjs diff --git a/packages/twenty-website-redone/scripts/product-demo-parity.mjs b/packages/twenty-website/scripts/product-demo-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/product-demo-parity.mjs rename to packages/twenty-website/scripts/product-demo-parity.mjs diff --git a/packages/twenty-website-redone/scripts/product-feature-parity.mjs b/packages/twenty-website/scripts/product-feature-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/product-feature-parity.mjs rename to packages/twenty-website/scripts/product-feature-parity.mjs diff --git a/packages/twenty-website-redone/scripts/product-hero-parity.mjs b/packages/twenty-website/scripts/product-hero-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/product-hero-parity.mjs rename to packages/twenty-website/scripts/product-hero-parity.mjs diff --git a/packages/twenty-website-redone/scripts/product-stepper-parity.mjs b/packages/twenty-website/scripts/product-stepper-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/product-stepper-parity.mjs rename to packages/twenty-website/scripts/product-stepper-parity.mjs diff --git a/packages/twenty-website-redone/scripts/three-cards-parity.mjs b/packages/twenty-website/scripts/three-cards-parity.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/three-cards-parity.mjs rename to packages/twenty-website/scripts/three-cards-parity.mjs diff --git a/packages/twenty-website-redone/scripts/visual-battery.mjs b/packages/twenty-website/scripts/visual-battery.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/visual-battery.mjs rename to packages/twenty-website/scripts/visual-battery.mjs diff --git a/packages/twenty-website-redone/scripts/visual-sweep.mjs b/packages/twenty-website/scripts/visual-sweep.mjs similarity index 100% rename from packages/twenty-website-redone/scripts/visual-sweep.mjs rename to packages/twenty-website/scripts/visual-sweep.mjs diff --git a/packages/twenty-website-redone/src/app-preview/AppPreview.tsx b/packages/twenty-website/src/app-preview/AppPreview.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/AppPreview.tsx rename to packages/twenty-website/src/app-preview/AppPreview.tsx diff --git a/packages/twenty-website-redone/src/app-preview/app-preview-chrome.ts b/packages/twenty-website/src/app-preview/app-preview-chrome.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/app-preview-chrome.ts rename to packages/twenty-website/src/app-preview/app-preview-chrome.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/companies-table-page.ts b/packages/twenty-website/src/app-preview/data/companies-table-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/companies-table-page.ts rename to packages/twenty-website/src/app-preview/data/companies-table-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/dashboards-table-page.ts b/packages/twenty-website/src/app-preview/data/dashboards-table-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/dashboards-table-page.ts rename to packages/twenty-website/src/app-preview/data/dashboards-table-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/normalize-page.ts b/packages/twenty-website/src/app-preview/data/normalize-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/normalize-page.ts rename to packages/twenty-website/src/app-preview/data/normalize-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/notes-table-page.ts b/packages/twenty-website/src/app-preview/data/notes-table-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/notes-table-page.ts rename to packages/twenty-website/src/app-preview/data/notes-table-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/object-pinned-actions.ts b/packages/twenty-website/src/app-preview/data/object-pinned-actions.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/object-pinned-actions.ts rename to packages/twenty-website/src/app-preview/data/object-pinned-actions.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/opportunity-kanban-page.ts b/packages/twenty-website/src/app-preview/data/opportunity-kanban-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/opportunity-kanban-page.ts rename to packages/twenty-website/src/app-preview/data/opportunity-kanban-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/people-table-page.ts b/packages/twenty-website/src/app-preview/data/people-table-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/people-table-page.ts rename to packages/twenty-website/src/app-preview/data/people-table-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/rocket-objects.ts b/packages/twenty-website/src/app-preview/data/rocket-objects.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/rocket-objects.ts rename to packages/twenty-website/src/app-preview/data/rocket-objects.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/sales-dashboard-page.ts b/packages/twenty-website/src/app-preview/data/sales-dashboard-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/sales-dashboard-page.ts rename to packages/twenty-website/src/app-preview/data/sales-dashboard-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/shared-asset-urls.ts b/packages/twenty-website/src/app-preview/data/shared-asset-urls.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/shared-asset-urls.ts rename to packages/twenty-website/src/app-preview/data/shared-asset-urls.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/sidebar-config.ts b/packages/twenty-website/src/app-preview/data/sidebar-config.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/sidebar-config.ts rename to packages/twenty-website/src/app-preview/data/sidebar-config.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/tasks-table-page.ts b/packages/twenty-website/src/app-preview/data/tasks-table-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/tasks-table-page.ts rename to packages/twenty-website/src/app-preview/data/tasks-table-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/data/workflows-folder.ts b/packages/twenty-website/src/app-preview/data/workflows-folder.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/data/workflows-folder.ts rename to packages/twenty-website/src/app-preview/data/workflows-folder.ts diff --git a/packages/twenty-website-redone/src/app-preview/pages/RenderPage.tsx b/packages/twenty-website/src/app-preview/pages/RenderPage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/RenderPage.tsx rename to packages/twenty-website/src/app-preview/pages/RenderPage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/dashboard/DashboardCharts.tsx b/packages/twenty-website/src/app-preview/pages/dashboard/DashboardCharts.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/dashboard/DashboardCharts.tsx rename to packages/twenty-website/src/app-preview/pages/dashboard/DashboardCharts.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/dashboard/DashboardPage.tsx b/packages/twenty-website/src/app-preview/pages/dashboard/DashboardPage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/dashboard/DashboardPage.tsx rename to packages/twenty-website/src/app-preview/pages/dashboard/DashboardPage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/kanban/KanbanCard.tsx b/packages/twenty-website/src/app-preview/pages/kanban/KanbanCard.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/kanban/KanbanCard.tsx rename to packages/twenty-website/src/app-preview/pages/kanban/KanbanCard.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/kanban/KanbanLane.tsx b/packages/twenty-website/src/app-preview/pages/kanban/KanbanLane.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/kanban/KanbanLane.tsx rename to packages/twenty-website/src/app-preview/pages/kanban/KanbanLane.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/kanban/KanbanPage.tsx b/packages/twenty-website/src/app-preview/pages/kanban/KanbanPage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/kanban/KanbanPage.tsx rename to packages/twenty-website/src/app-preview/pages/kanban/KanbanPage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/AvatarGroup.tsx b/packages/twenty-website/src/app-preview/pages/record/AvatarGroup.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/AvatarGroup.tsx rename to packages/twenty-website/src/app-preview/pages/record/AvatarGroup.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordCalendar.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordCalendar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordCalendar.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordCalendar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordEmails.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordEmails.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordEmails.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordEmails.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordFieldValue.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordFieldValue.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordFieldValue.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordFieldValue.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordFiles.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordFiles.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordFiles.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordFiles.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordNotes.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordNotes.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordNotes.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordNotes.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordPage.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordPage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordPage.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordPage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordPanelChrome.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordPanelChrome.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordPanelChrome.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordPanelChrome.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordTasks.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordTasks.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordTasks.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordTasks.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/RecordTimeline.tsx b/packages/twenty-website/src/app-preview/pages/record/RecordTimeline.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/RecordTimeline.tsx rename to packages/twenty-website/src/app-preview/pages/record/RecordTimeline.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/record-tabs.test.ts b/packages/twenty-website/src/app-preview/pages/record/record-tabs.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/record-tabs.test.ts rename to packages/twenty-website/src/app-preview/pages/record/record-tabs.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/pages/record/record-tabs.ts b/packages/twenty-website/src/app-preview/pages/record/record-tabs.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/record/record-tabs.ts rename to packages/twenty-website/src/app-preview/pages/record/record-tabs.ts diff --git a/packages/twenty-website-redone/src/app-preview/pages/table/TableCellValue.tsx b/packages/twenty-website/src/app-preview/pages/table/TableCellValue.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/table/TableCellValue.tsx rename to packages/twenty-website/src/app-preview/pages/table/TableCellValue.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/table/TableCheckbox.tsx b/packages/twenty-website/src/app-preview/pages/table/TableCheckbox.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/table/TableCheckbox.tsx rename to packages/twenty-website/src/app-preview/pages/table/TableCheckbox.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/table/TableHeaderIcon.tsx b/packages/twenty-website/src/app-preview/pages/table/TableHeaderIcon.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/table/TableHeaderIcon.tsx rename to packages/twenty-website/src/app-preview/pages/table/TableHeaderIcon.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/table/TablePage.tsx b/packages/twenty-website/src/app-preview/pages/table/TablePage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/table/TablePage.tsx rename to packages/twenty-website/src/app-preview/pages/table/TablePage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowBranchLabel.tsx b/packages/twenty-website/src/app-preview/pages/workflow/WorkflowBranchLabel.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowBranchLabel.tsx rename to packages/twenty-website/src/app-preview/pages/workflow/WorkflowBranchLabel.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowEdges.tsx b/packages/twenty-website/src/app-preview/pages/workflow/WorkflowEdges.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowEdges.tsx rename to packages/twenty-website/src/app-preview/pages/workflow/WorkflowEdges.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowNode.tsx b/packages/twenty-website/src/app-preview/pages/workflow/WorkflowNode.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowNode.tsx rename to packages/twenty-website/src/app-preview/pages/workflow/WorkflowNode.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowPage.tsx b/packages/twenty-website/src/app-preview/pages/workflow/WorkflowPage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/WorkflowPage.tsx rename to packages/twenty-website/src/app-preview/pages/workflow/WorkflowPage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-data.ts b/packages/twenty-website/src/app-preview/pages/workflow/workflow-data.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-data.ts rename to packages/twenty-website/src/app-preview/pages/workflow/workflow-data.ts diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-geometry.test.ts b/packages/twenty-website/src/app-preview/pages/workflow/workflow-geometry.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-geometry.test.ts rename to packages/twenty-website/src/app-preview/pages/workflow/workflow-geometry.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-geometry.ts b/packages/twenty-website/src/app-preview/pages/workflow/workflow-geometry.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-geometry.ts rename to packages/twenty-website/src/app-preview/pages/workflow/workflow-geometry.ts diff --git a/packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-theme.ts b/packages/twenty-website/src/app-preview/pages/workflow/workflow-theme.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/pages/workflow/workflow-theme.ts rename to packages/twenty-website/src/app-preview/pages/workflow/workflow-theme.ts diff --git a/packages/twenty-website-redone/src/app-preview/preview-font-size.ts b/packages/twenty-website/src/app-preview/preview-font-size.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/preview-font-size.ts rename to packages/twenty-website/src/app-preview/preview-font-size.ts diff --git a/packages/twenty-website-redone/src/app-preview/primitives/Chip.tsx b/packages/twenty-website/src/app-preview/primitives/Chip.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/Chip.tsx rename to packages/twenty-website/src/app-preview/primitives/Chip.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/FaviconLogo.tsx b/packages/twenty-website/src/app-preview/primitives/FaviconLogo.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/FaviconLogo.tsx rename to packages/twenty-website/src/app-preview/primitives/FaviconLogo.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/MiniIcon.tsx b/packages/twenty-website/src/app-preview/primitives/MiniIcon.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/MiniIcon.tsx rename to packages/twenty-website/src/app-preview/primitives/MiniIcon.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/PersonAvatar.tsx b/packages/twenty-website/src/app-preview/primitives/PersonAvatar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/PersonAvatar.tsx rename to packages/twenty-website/src/app-preview/primitives/PersonAvatar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/PreviewAvatar.tsx b/packages/twenty-website/src/app-preview/primitives/PreviewAvatar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/PreviewAvatar.tsx rename to packages/twenty-website/src/app-preview/primitives/PreviewAvatar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/PreviewIcon.tsx b/packages/twenty-website/src/app-preview/primitives/PreviewIcon.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/PreviewIcon.tsx rename to packages/twenty-website/src/app-preview/primitives/PreviewIcon.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/PreviewRoundedLink.tsx b/packages/twenty-website/src/app-preview/primitives/PreviewRoundedLink.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/PreviewRoundedLink.tsx rename to packages/twenty-website/src/app-preview/primitives/PreviewRoundedLink.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/PreviewSkeleton.tsx b/packages/twenty-website/src/app-preview/primitives/PreviewSkeleton.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/PreviewSkeleton.tsx rename to packages/twenty-website/src/app-preview/primitives/PreviewSkeleton.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/PreviewTag.tsx b/packages/twenty-website/src/app-preview/primitives/PreviewTag.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/PreviewTag.tsx rename to packages/twenty-website/src/app-preview/primitives/PreviewTag.tsx diff --git a/packages/twenty-website-redone/src/app-preview/primitives/get-initials.ts b/packages/twenty-website/src/app-preview/primitives/get-initials.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/primitives/get-initials.ts rename to packages/twenty-website/src/app-preview/primitives/get-initials.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/AiPanel.tsx b/packages/twenty-website/src/app-preview/product-visual/AiPanel.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/AiPanel.tsx rename to packages/twenty-website/src/app-preview/product-visual/AiPanel.tsx diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/AiSteps.tsx b/packages/twenty-website/src/app-preview/product-visual/AiSteps.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/AiSteps.tsx rename to packages/twenty-website/src/app-preview/product-visual/AiSteps.tsx diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/ProductHeroCursor.tsx b/packages/twenty-website/src/app-preview/product-visual/ProductHeroCursor.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/ProductHeroCursor.tsx rename to packages/twenty-website/src/app-preview/product-visual/ProductHeroCursor.tsx diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/ProductVisual.tsx b/packages/twenty-website/src/app-preview/product-visual/ProductVisual.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/ProductVisual.tsx rename to packages/twenty-website/src/app-preview/product-visual/ProductVisual.tsx diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/anthropic-record-page.ts b/packages/twenty-website/src/app-preview/product-visual/anthropic-record-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/anthropic-record-page.ts rename to packages/twenty-website/src/app-preview/product-visual/anthropic-record-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/cursor-glide.ts b/packages/twenty-website/src/app-preview/product-visual/cursor-glide.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/cursor-glide.ts rename to packages/twenty-website/src/app-preview/product-visual/cursor-glide.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/cursor-tour-phases.test.ts b/packages/twenty-website/src/app-preview/product-visual/cursor-tour-phases.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/cursor-tour-phases.test.ts rename to packages/twenty-website/src/app-preview/product-visual/cursor-tour-phases.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/cursor-tour-phases.ts b/packages/twenty-website/src/app-preview/product-visual/cursor-tour-phases.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/cursor-tour-phases.ts rename to packages/twenty-website/src/app-preview/product-visual/cursor-tour-phases.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/display-page.test.ts b/packages/twenty-website/src/app-preview/product-visual/display-page.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/display-page.test.ts rename to packages/twenty-website/src/app-preview/product-visual/display-page.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/display-page.ts b/packages/twenty-website/src/app-preview/product-visual/display-page.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/display-page.ts rename to packages/twenty-website/src/app-preview/product-visual/display-page.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/hero-cursors.ts b/packages/twenty-website/src/app-preview/product-visual/hero-cursors.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/hero-cursors.ts rename to packages/twenty-website/src/app-preview/product-visual/hero-cursors.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/new-task-rows.ts b/packages/twenty-website/src/app-preview/product-visual/new-task-rows.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/new-task-rows.ts rename to packages/twenty-website/src/app-preview/product-visual/new-task-rows.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/page-item-ids.ts b/packages/twenty-website/src/app-preview/product-visual/page-item-ids.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/page-item-ids.ts rename to packages/twenty-website/src/app-preview/product-visual/page-item-ids.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/product-visual-scenes.ts b/packages/twenty-website/src/app-preview/product-visual/product-visual-scenes.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/product-visual-scenes.ts rename to packages/twenty-website/src/app-preview/product-visual/product-visual-scenes.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/streamed-markdown.test.ts b/packages/twenty-website/src/app-preview/product-visual/streamed-markdown.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/streamed-markdown.test.ts rename to packages/twenty-website/src/app-preview/product-visual/streamed-markdown.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/streamed-markdown.ts b/packages/twenty-website/src/app-preview/product-visual/streamed-markdown.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/streamed-markdown.ts rename to packages/twenty-website/src/app-preview/product-visual/streamed-markdown.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/use-product-hero-cursor-autoplay.ts b/packages/twenty-website/src/app-preview/product-visual/use-product-hero-cursor-autoplay.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/use-product-hero-cursor-autoplay.ts rename to packages/twenty-website/src/app-preview/product-visual/use-product-hero-cursor-autoplay.ts diff --git a/packages/twenty-website-redone/src/app-preview/product-visual/use-product-visual-autoplay.ts b/packages/twenty-website/src/app-preview/product-visual/use-product-visual-autoplay.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/product-visual/use-product-visual-autoplay.ts rename to packages/twenty-website/src/app-preview/product-visual/use-product-visual-autoplay.ts diff --git a/packages/twenty-website-redone/src/app-preview/shell/PreviewAppLayout.tsx b/packages/twenty-website/src/app-preview/shell/PreviewAppLayout.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/PreviewAppLayout.tsx rename to packages/twenty-website/src/app-preview/shell/PreviewAppLayout.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/PreviewNavbar.tsx b/packages/twenty-website/src/app-preview/shell/PreviewNavbar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/PreviewNavbar.tsx rename to packages/twenty-website/src/app-preview/shell/PreviewNavbar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/PreviewSidebar.tsx b/packages/twenty-website/src/app-preview/shell/PreviewSidebar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/PreviewSidebar.tsx rename to packages/twenty-website/src/app-preview/shell/PreviewSidebar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/PreviewViewbar.tsx b/packages/twenty-website/src/app-preview/shell/PreviewViewbar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/PreviewViewbar.tsx rename to packages/twenty-website/src/app-preview/shell/PreviewViewbar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/SidebarControls.tsx b/packages/twenty-website/src/app-preview/shell/SidebarControls.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/SidebarControls.tsx rename to packages/twenty-website/src/app-preview/shell/SidebarControls.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/SidebarFolder.tsx b/packages/twenty-website/src/app-preview/shell/SidebarFolder.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/SidebarFolder.tsx rename to packages/twenty-website/src/app-preview/shell/SidebarFolder.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/SidebarItem.tsx b/packages/twenty-website/src/app-preview/shell/SidebarItem.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/SidebarItem.tsx rename to packages/twenty-website/src/app-preview/shell/SidebarItem.tsx diff --git a/packages/twenty-website-redone/src/app-preview/shell/is-sidebar-folder.ts b/packages/twenty-website/src/app-preview/shell/is-sidebar-folder.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/is-sidebar-folder.ts rename to packages/twenty-website/src/app-preview/shell/is-sidebar-folder.ts diff --git a/packages/twenty-website-redone/src/app-preview/shell/use-app-preview-crm-scenario.ts b/packages/twenty-website/src/app-preview/shell/use-app-preview-crm-scenario.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/use-app-preview-crm-scenario.ts rename to packages/twenty-website/src/app-preview/shell/use-app-preview-crm-scenario.ts diff --git a/packages/twenty-website-redone/src/app-preview/shell/use-app-preview-experience.ts b/packages/twenty-website/src/app-preview/shell/use-app-preview-experience.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/use-app-preview-experience.ts rename to packages/twenty-website/src/app-preview/shell/use-app-preview-experience.ts diff --git a/packages/twenty-website-redone/src/app-preview/shell/use-app-preview-navigation.ts b/packages/twenty-website/src/app-preview/shell/use-app-preview-navigation.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/shell/use-app-preview-navigation.ts rename to packages/twenty-website/src/app-preview/shell/use-app-preview-navigation.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/AppWindow.tsx b/packages/twenty-website/src/app-preview/stage/AppWindow.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/AppWindow.tsx rename to packages/twenty-website/src/app-preview/stage/AppWindow.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/FlyingTrafficLights.tsx b/packages/twenty-website/src/app-preview/stage/FlyingTrafficLights.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/FlyingTrafficLights.tsx rename to packages/twenty-website/src/app-preview/stage/FlyingTrafficLights.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/ProductFrame.tsx b/packages/twenty-website/src/app-preview/stage/ProductFrame.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/ProductFrame.tsx rename to packages/twenty-website/src/app-preview/stage/ProductFrame.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/TrafficLightDefinitions.tsx b/packages/twenty-website/src/app-preview/stage/TrafficLightDefinitions.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/TrafficLightDefinitions.tsx rename to packages/twenty-website/src/app-preview/stage/TrafficLightDefinitions.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/TrafficLights.tsx b/packages/twenty-website/src/app-preview/stage/TrafficLights.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/TrafficLights.tsx rename to packages/twenty-website/src/app-preview/stage/TrafficLights.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/WindowBar.tsx b/packages/twenty-website/src/app-preview/stage/WindowBar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/WindowBar.tsx rename to packages/twenty-website/src/app-preview/stage/WindowBar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/WindowOrderProvider.tsx b/packages/twenty-website/src/app-preview/stage/WindowOrderProvider.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/WindowOrderProvider.tsx rename to packages/twenty-website/src/app-preview/stage/WindowOrderProvider.tsx diff --git a/packages/twenty-website-redone/src/app-preview/stage/timeout-registry.test.ts b/packages/twenty-website/src/app-preview/stage/timeout-registry.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/timeout-registry.test.ts rename to packages/twenty-website/src/app-preview/stage/timeout-registry.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/timeout-registry.ts b/packages/twenty-website/src/app-preview/stage/timeout-registry.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/timeout-registry.ts rename to packages/twenty-website/src/app-preview/stage/timeout-registry.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/traffic-light-physics.test.ts b/packages/twenty-website/src/app-preview/stage/traffic-light-physics.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/traffic-light-physics.test.ts rename to packages/twenty-website/src/app-preview/stage/traffic-light-physics.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/traffic-light-physics.ts b/packages/twenty-website/src/app-preview/stage/traffic-light-physics.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/traffic-light-physics.ts rename to packages/twenty-website/src/app-preview/stage/traffic-light-physics.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/traffic-lights-escape-event.ts b/packages/twenty-website/src/app-preview/stage/traffic-lights-escape-event.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/traffic-lights-escape-event.ts rename to packages/twenty-website/src/app-preview/stage/traffic-lights-escape-event.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/use-timeout-registry.ts b/packages/twenty-website/src/app-preview/stage/use-timeout-registry.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/use-timeout-registry.ts rename to packages/twenty-website/src/app-preview/stage/use-timeout-registry.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/use-traffic-lights-escape.ts b/packages/twenty-website/src/app-preview/stage/use-traffic-lights-escape.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/use-traffic-lights-escape.ts rename to packages/twenty-website/src/app-preview/stage/use-traffic-lights-escape.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/use-window-order.ts b/packages/twenty-website/src/app-preview/stage/use-window-order.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/use-window-order.ts rename to packages/twenty-website/src/app-preview/stage/use-window-order.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/use-window-pointer-interactions.ts b/packages/twenty-website/src/app-preview/stage/use-window-pointer-interactions.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/use-window-pointer-interactions.ts rename to packages/twenty-website/src/app-preview/stage/use-window-pointer-interactions.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/window-geometry.test.ts b/packages/twenty-website/src/app-preview/stage/window-geometry.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/window-geometry.test.ts rename to packages/twenty-website/src/app-preview/stage/window-geometry.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/window-geometry.ts b/packages/twenty-website/src/app-preview/stage/window-geometry.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/window-geometry.ts rename to packages/twenty-website/src/app-preview/stage/window-geometry.ts diff --git a/packages/twenty-website-redone/src/app-preview/stage/window-order-contexts.ts b/packages/twenty-website/src/app-preview/stage/window-order-contexts.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/stage/window-order-contexts.ts rename to packages/twenty-website/src/app-preview/stage/window-order-contexts.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/AssistantResponse.tsx b/packages/twenty-website/src/app-preview/terminal/AssistantResponse.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/AssistantResponse.tsx rename to packages/twenty-website/src/app-preview/terminal/AssistantResponse.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/AssistantResponseSegments.tsx b/packages/twenty-website/src/app-preview/terminal/AssistantResponseSegments.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/AssistantResponseSegments.tsx rename to packages/twenty-website/src/app-preview/terminal/AssistantResponseSegments.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/ChangesSummaryCard.tsx b/packages/twenty-website/src/app-preview/terminal/ChangesSummaryCard.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/ChangesSummaryCard.tsx rename to packages/twenty-website/src/app-preview/terminal/ChangesSummaryCard.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/ChangesSummaryDiffCounts.tsx b/packages/twenty-website/src/app-preview/terminal/ChangesSummaryDiffCounts.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/ChangesSummaryDiffCounts.tsx rename to packages/twenty-website/src/app-preview/terminal/ChangesSummaryDiffCounts.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/ChangesSummaryFileRow.tsx b/packages/twenty-website/src/app-preview/terminal/ChangesSummaryFileRow.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/ChangesSummaryFileRow.tsx rename to packages/twenty-website/src/app-preview/terminal/ChangesSummaryFileRow.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/ConversationPanel.tsx b/packages/twenty-website/src/app-preview/terminal/ConversationPanel.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/ConversationPanel.tsx rename to packages/twenty-website/src/app-preview/terminal/ConversationPanel.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/CursorLogo.tsx b/packages/twenty-website/src/app-preview/terminal/CursorLogo.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/CursorLogo.tsx rename to packages/twenty-website/src/app-preview/terminal/CursorLogo.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/StreamingText.tsx b/packages/twenty-website/src/app-preview/terminal/StreamingText.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/StreamingText.tsx rename to packages/twenty-website/src/app-preview/terminal/StreamingText.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/Terminal.tsx b/packages/twenty-website/src/app-preview/terminal/Terminal.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/Terminal.tsx rename to packages/twenty-website/src/app-preview/terminal/Terminal.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalContent.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalContent.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalContent.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalContent.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptBox.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalPromptBox.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptBox.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalPromptBox.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptChip.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalPromptChip.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptChip.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalPromptChip.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptFooter.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalPromptFooter.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptFooter.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalPromptFooter.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptMessage.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalPromptMessage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalPromptMessage.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalPromptMessage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalResizeHandles.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalResizeHandles.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalResizeHandles.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalResizeHandles.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalSendButton.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalSendButton.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalSendButton.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalSendButton.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalSendButtonFingerHint.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalSendButtonFingerHint.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalSendButtonFingerHint.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalSendButtonFingerHint.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalToggle.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalToggle.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalToggle.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalToggle.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/TerminalTopBar.tsx b/packages/twenty-website/src/app-preview/terminal/TerminalTopBar.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/TerminalTopBar.tsx rename to packages/twenty-website/src/app-preview/terminal/TerminalTopBar.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/ThinkingIndicator.tsx b/packages/twenty-website/src/app-preview/terminal/ThinkingIndicator.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/ThinkingIndicator.tsx rename to packages/twenty-website/src/app-preview/terminal/ThinkingIndicator.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/UserMessage.tsx b/packages/twenty-website/src/app-preview/terminal/UserMessage.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/UserMessage.tsx rename to packages/twenty-website/src/app-preview/terminal/UserMessage.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/assistant-response-stage.test.ts b/packages/twenty-website/src/app-preview/terminal/assistant-response-stage.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/assistant-response-stage.test.ts rename to packages/twenty-website/src/app-preview/terminal/assistant-response-stage.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/assistant-response-stage.ts b/packages/twenty-website/src/app-preview/terminal/assistant-response-stage.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/assistant-response-stage.ts rename to packages/twenty-website/src/app-preview/terminal/assistant-response-stage.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/changes-summary-card-state.test.ts b/packages/twenty-website/src/app-preview/terminal/changes-summary-card-state.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/changes-summary-card-state.test.ts rename to packages/twenty-website/src/app-preview/terminal/changes-summary-card-state.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/changes-summary-card-state.ts b/packages/twenty-website/src/app-preview/terminal/changes-summary-card-state.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/changes-summary-card-state.ts rename to packages/twenty-website/src/app-preview/terminal/changes-summary-card-state.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/changeset-totals.ts b/packages/twenty-website/src/app-preview/terminal/changeset-totals.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/changeset-totals.ts rename to packages/twenty-website/src/app-preview/terminal/changeset-totals.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/conversation-core.ts b/packages/twenty-website/src/app-preview/terminal/conversation-core.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/conversation-core.ts rename to packages/twenty-website/src/app-preview/terminal/conversation-core.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/conversation-scroll.test.ts b/packages/twenty-website/src/app-preview/terminal/conversation-scroll.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/conversation-scroll.test.ts rename to packages/twenty-website/src/app-preview/terminal/conversation-scroll.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/conversation-scroll.ts b/packages/twenty-website/src/app-preview/terminal/conversation-scroll.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/conversation-scroll.ts rename to packages/twenty-website/src/app-preview/terminal/conversation-scroll.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/diff-spans.ts b/packages/twenty-website/src/app-preview/terminal/diff-spans.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/diff-spans.ts rename to packages/twenty-website/src/app-preview/terminal/diff-spans.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/diff/DiffPill.tsx b/packages/twenty-website/src/app-preview/terminal/diff/DiffPill.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/diff/DiffPill.tsx rename to packages/twenty-website/src/app-preview/terminal/diff/DiffPill.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/diff/TerminalDiff.tsx b/packages/twenty-website/src/app-preview/terminal/diff/TerminalDiff.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/diff/TerminalDiff.tsx rename to packages/twenty-website/src/app-preview/terminal/diff/TerminalDiff.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/diff/diff-data.ts b/packages/twenty-website/src/app-preview/terminal/diff/diff-data.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/diff/diff-data.ts rename to packages/twenty-website/src/app-preview/terminal/diff/diff-data.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditor.tsx b/packages/twenty-website/src/app-preview/terminal/editor/TerminalEditor.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditor.tsx rename to packages/twenty-website/src/app-preview/terminal/editor/TerminalEditor.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditorCodeView.tsx b/packages/twenty-website/src/app-preview/terminal/editor/TerminalEditorCodeView.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditorCodeView.tsx rename to packages/twenty-website/src/app-preview/terminal/editor/TerminalEditorCodeView.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditorExplorer.tsx b/packages/twenty-website/src/app-preview/terminal/editor/TerminalEditorExplorer.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditorExplorer.tsx rename to packages/twenty-website/src/app-preview/terminal/editor/TerminalEditorExplorer.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditorTabs.tsx b/packages/twenty-website/src/app-preview/terminal/editor/TerminalEditorTabs.tsx similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/TerminalEditorTabs.tsx rename to packages/twenty-website/src/app-preview/terminal/editor/TerminalEditorTabs.tsx diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/editor-explorer-nodes.ts b/packages/twenty-website/src/app-preview/terminal/editor/editor-explorer-nodes.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/editor-explorer-nodes.ts rename to packages/twenty-website/src/app-preview/terminal/editor/editor-explorer-nodes.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/editor-files.ts b/packages/twenty-website/src/app-preview/terminal/editor/editor-files.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/editor-files.ts rename to packages/twenty-website/src/app-preview/terminal/editor/editor-files.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/editor-generated-file-ids.ts b/packages/twenty-website/src/app-preview/terminal/editor/editor-generated-file-ids.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/editor-generated-file-ids.ts rename to packages/twenty-website/src/app-preview/terminal/editor/editor-generated-file-ids.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/editor-types.ts b/packages/twenty-website/src/app-preview/terminal/editor/editor-types.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/editor-types.ts rename to packages/twenty-website/src/app-preview/terminal/editor/editor-types.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/terminal-editor-state.test.ts b/packages/twenty-website/src/app-preview/terminal/editor/terminal-editor-state.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/terminal-editor-state.test.ts rename to packages/twenty-website/src/app-preview/terminal/editor/terminal-editor-state.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/terminal-editor-state.ts b/packages/twenty-website/src/app-preview/terminal/editor/terminal-editor-state.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/terminal-editor-state.ts rename to packages/twenty-website/src/app-preview/terminal/editor/terminal-editor-state.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/editor/tokenize-editor-source.ts b/packages/twenty-website/src/app-preview/terminal/editor/tokenize-editor-source.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/editor/tokenize-editor-source.ts rename to packages/twenty-website/src/app-preview/terminal/editor/tokenize-editor-source.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/prompt-easter-egg-state.test.ts b/packages/twenty-website/src/app-preview/terminal/prompt-easter-egg-state.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/prompt-easter-egg-state.test.ts rename to packages/twenty-website/src/app-preview/terminal/prompt-easter-egg-state.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/prompt-easter-egg-state.ts b/packages/twenty-website/src/app-preview/terminal/prompt-easter-egg-state.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/prompt-easter-egg-state.ts rename to packages/twenty-website/src/app-preview/terminal/prompt-easter-egg-state.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/rocket-changeset.ts b/packages/twenty-website/src/app-preview/terminal/rocket-changeset.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/rocket-changeset.ts rename to packages/twenty-website/src/app-preview/terminal/rocket-changeset.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/terminal-conversation-state.ts b/packages/twenty-website/src/app-preview/terminal/terminal-conversation-state.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/terminal-conversation-state.ts rename to packages/twenty-website/src/app-preview/terminal/terminal-conversation-state.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/terminal-send-button-hint-position.test.ts b/packages/twenty-website/src/app-preview/terminal/terminal-send-button-hint-position.test.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/terminal-send-button-hint-position.test.ts rename to packages/twenty-website/src/app-preview/terminal/terminal-send-button-hint-position.test.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/terminal-send-button-hint-position.ts b/packages/twenty-website/src/app-preview/terminal/terminal-send-button-hint-position.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/terminal-send-button-hint-position.ts rename to packages/twenty-website/src/app-preview/terminal/terminal-send-button-hint-position.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/terminal-window-geometry.ts b/packages/twenty-website/src/app-preview/terminal/terminal-window-geometry.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/terminal-window-geometry.ts rename to packages/twenty-website/src/app-preview/terminal/terminal-window-geometry.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/use-conversation-auto-scroll.ts b/packages/twenty-website/src/app-preview/terminal/use-conversation-auto-scroll.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/use-conversation-auto-scroll.ts rename to packages/twenty-website/src/app-preview/terminal/use-conversation-auto-scroll.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/use-terminal-conversation-workflow.ts b/packages/twenty-website/src/app-preview/terminal/use-terminal-conversation-workflow.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/use-terminal-conversation-workflow.ts rename to packages/twenty-website/src/app-preview/terminal/use-terminal-conversation-workflow.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/use-terminal-prompt-easter-egg.ts b/packages/twenty-website/src/app-preview/terminal/use-terminal-prompt-easter-egg.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/use-terminal-prompt-easter-egg.ts rename to packages/twenty-website/src/app-preview/terminal/use-terminal-prompt-easter-egg.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/use-terminal-send-button-hint.ts b/packages/twenty-website/src/app-preview/terminal/use-terminal-send-button-hint.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/use-terminal-send-button-hint.ts rename to packages/twenty-website/src/app-preview/terminal/use-terminal-send-button-hint.ts diff --git a/packages/twenty-website-redone/src/app-preview/terminal/use-terminal-window-layout.ts b/packages/twenty-website/src/app-preview/terminal/use-terminal-window-layout.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/terminal/use-terminal-window-layout.ts rename to packages/twenty-website/src/app-preview/terminal/use-terminal-window-layout.ts diff --git a/packages/twenty-website-redone/src/app-preview/types.ts b/packages/twenty-website/src/app-preview/types.ts similarity index 100% rename from packages/twenty-website-redone/src/app-preview/types.ts rename to packages/twenty-website/src/app-preview/types.ts diff --git a/packages/twenty-website-redone/src/app/[locale]/(focused)/partners/apply/PartnerApplicationPageContent.tsx b/packages/twenty-website/src/app/[locale]/(focused)/partners/apply/PartnerApplicationPageContent.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(focused)/partners/apply/PartnerApplicationPageContent.tsx rename to packages/twenty-website/src/app/[locale]/(focused)/partners/apply/PartnerApplicationPageContent.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(focused)/partners/apply/page.tsx b/packages/twenty-website/src/app/[locale]/(focused)/partners/apply/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(focused)/partners/apply/page.tsx rename to packages/twenty-website/src/app/[locale]/(focused)/partners/apply/page.tsx diff --git a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeFeatureThreeCards.tsx b/packages/twenty-website/src/app/[locale]/(home)/_components/HomeFeatureThreeCards.tsx deleted file mode 100644 index 8a3097ce06..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeFeatureThreeCards.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Trans } from '@lingui/react/macro'; - -import { FEATURE_CARDS } from '@/app/[locale]/(home)/three-cards-feature.data'; -import { Eyebrow, Heading, HeadingPart } from '@/design-system/components'; -import { FeatureCards } from '@/sections/ThreeCards'; -import { ThreeCardsIntro, ThreeCardsSection } from '@/templates/ThreeCards'; - -export function HomeFeatureThreeCards() { - return ( - - - - - Skip the clunky UX that always comes with custom. - - - - - - Make your GTM team happy - -
- with - a CRM they'll love -
-
-
- -
- ); -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeHero.tsx b/packages/twenty-website/src/app/[locale]/(home)/_components/HomeHero.tsx deleted file mode 100644 index c0c1583be3..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeHero.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { Trans } from '@lingui/react/macro'; -import { styled } from '@linaria/react'; - -import { HeadingPart, LinkButton } from '@/design-system/components'; -import { getServerI18n } from '@/lib/i18n/server'; -import { WebGlMount } from '@/lib/visual-runtime'; -import { APP_PREVIEW_DATA, AppPreview } from '@/sections/AppPreview'; -import { TalkToUsButton } from '@/sections/ContactCal'; -import { HeroBody, HeroCta, HeroHeading, HeroSection } from '@/templates/Hero'; -import { HomeBackgroundHalftone } from '@/sections/Hero/visuals/components/HomeBackgroundHalftone'; -import { theme } from '@/theme'; - -const HeroHeadingGroup = styled.div` - align-items: center; - display: flex; - flex-direction: column; - gap: ${theme.spacing(3)}; - width: 100%; - - > *:last-child { - margin-top: 0; - } -`; - -const HeroIntroGroup = styled.div` - align-items: center; - display: flex; - flex-direction: column; - gap: ${theme.spacing(8)}; - width: 100%; -`; - -export function HomeHero() { - const i18n = getServerI18n(); - - return ( - - - - } - > - - - - - - Build your Enterprise CRM - - at AI Speed - - - - - Twenty gives technical teams the building blocks for a custom CRM - that meets complex business needs and quickly adapts as the - business evolves. - - - - - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeIllustrationThreeCards.tsx b/packages/twenty-website/src/app/[locale]/(home)/_components/HomeIllustrationThreeCards.tsx deleted file mode 100644 index 60d1516e47..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeIllustrationThreeCards.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { Trans } from '@lingui/react/macro'; -import { css } from '@linaria/core'; -import { styled } from '@linaria/react'; - -import { ILLUSTRATION_CARDS } from '@/app/[locale]/(home)/three-cards-illustration.data'; -import { - Body, - Eyebrow, - Heading, - HeadingPart, -} from '@/design-system/components'; -import { IllustrationCards } from '@/sections/ThreeCards'; -import { ThreeCardsIntro, ThreeCardsSection } from '@/templates/ThreeCards'; -import { theme } from '@/theme'; - -const IntroContent = styled.div` - display: grid; - grid-template-columns: 1fr; - row-gap: ${theme.spacing(2)}; - width: 100%; -`; - -const IntroHeader = styled.div` - display: grid; - grid-template-columns: 1fr; - row-gap: ${theme.spacing(6)}; - width: 100%; -`; - -const headingClassName = css` - width: 100%; - - @media (min-width: ${theme.breakpoints.md}px) { - max-width: ${theme.layout.editorial}; - } - - [data-family='sans'] { - letter-spacing: -0.02em; - } -`; - -const bodyClassName = css` - width: 100%; - - @media (min-width: ${theme.breakpoints.md}px) { - max-width: 571px; - } -`; - -export function HomeIllustrationThreeCards() { - return ( - - - - - - - Stop settling for trade-offs. - - - - - - Assemble, iterate and adapt a robust CRM, - - - that's quick to flex - - - - - - - Compose your CRM and internal apps with a single extensibility - toolkit. - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeProblem.tsx b/packages/twenty-website/src/app/[locale]/(home)/_components/HomeProblem.tsx deleted file mode 100644 index 130c435eb6..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeProblem.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { Trans } from '@lingui/react/macro'; - -import { Eyebrow, HeadingPart } from '@/design-system/components'; -import { - ProblemContent, - ProblemHeading, - ProblemPoints, - ProblemSection, - ProblemVisual, - type ProblemPointType, -} from '@/sections/Problem'; - -export function HomeProblem() { - const points: ProblemPointType[] = [ - { - heading: ( - - The Giant Monolith - - ), - body: msg`Proprietary languages, slow deployment cycles, and "black box" logic.`, - }, - { - heading: ( - - The In-house Burden - - ), - body: msg`It's fragile. V1 ships quickly, but maintaining and making changes is a long term burden.`, - }, - ]; - - return ( - - - - - - The Problem. - - - - - - A custom CRM gives your org an edge, - - but building one - comes with - tradeoffs - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeStepperSection.tsx b/packages/twenty-website/src/app/[locale]/(home)/_components/HomeStepperSection.tsx deleted file mode 100644 index f9b515e404..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeStepperSection.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { Trans } from '@lingui/react/macro'; - -import { Heading, HeadingPart } from '@/design-system/components'; -import { - HomeStepperScrollSection, - type HomeStepperStepType, -} from '@/sections/HomeStepper'; - -export function HomeStepperSection() { - const steps: HomeStepperStepType[] = [ - { - heading: ( - - - - Begin with production-grade - - building blocks - - - ), - body: msg`Compose your CRM and internal apps with a single extensibility toolkit. Data model, layout, and automation.`, - }, - { - heading: ( - - - Continue iteration - without friction - - - ), - body: msg`Enjoy unlimited customization using the AI coding tools you already love. Adapt your CRM to fit the way your business grows and wins.`, - }, - { - heading: ( - - - - Stay in control with our - - open-source software - - - ), - body: msg`Don't get locked into someone else's ecosystem. Twenty's developer experience looks like normal software, with local setup, real data, live testing, and no proprietary tooling.`, - }, - ]; - - return ; -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeTestimonials.tsx b/packages/twenty-website/src/app/[locale]/(home)/_components/HomeTestimonials.tsx deleted file mode 100644 index 0887bf6990..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/_components/HomeTestimonials.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { msg } from '@lingui/core/macro'; - -import { HOME_TESTIMONIALS } from '@/app/[locale]/(home)/testimonials.data'; -import { getServerI18n } from '@/lib/i18n/server'; -import { - TestimonialsCarousel, - TestimonialsHourglassVisual, -} from '@/sections/Testimonials'; -import { TestimonialsSection } from '@/templates/Testimonials'; - -export function HomeTestimonials() { - const i18n = getServerI18n(); - - return ( - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/helped.data.ts b/packages/twenty-website/src/app/[locale]/(home)/helped.data.ts deleted file mode 100644 index 12e67db252..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/helped.data.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import type { HeadingCardType } from '@/sections/Helped'; - -export const HELPED_CARDS: HeadingCardType[] = [ - { - icon: 'w3villa', - heading: msg`Ship a product on Twenty`, - body: msg`W3villa built W3Grads for AI mock interviews at scale, with Twenty as the operational backbone.`, - illustration: 'target', - href: '/customers/w3villa', - }, - { - icon: 'act-education', - heading: msg`Own your CRM end to end`, - body: msg`AC&T replaced a shuttered vendor CRM with self-hosted Twenty and cut CRM costs by more than 90%.`, - illustration: 'spaceship', - href: '/customers/act-education', - }, - { - icon: 'netzero', - heading: msg`Grow with a flexible foundation`, - body: msg`NetZero runs a modular Twenty setup across carbon credits, ag products, and industrial systems.`, - illustration: 'money', - href: '/customers/netzero', - }, -]; diff --git a/packages/twenty-website/src/app/[locale]/(home)/page.tsx b/packages/twenty-website/src/app/[locale]/(home)/page.tsx deleted file mode 100644 index 0227781c3e..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/page.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import { HELPED_CARDS } from '@/app/[locale]/(home)/helped.data'; -import { HomeProblem } from '@/app/[locale]/(home)/_components/HomeProblem'; -import { Faq, FAQ_QUESTIONS } from '@/sections/Faq'; -import { TrustedBy } from '@/sections/TrustedBy'; -import { fetchCommunityStats } from '@/lib/community/fetch-community-stats'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels'; -import { Helped } from '@/sections/Helped'; -import { HomeHero } from '@/app/[locale]/(home)/_components/HomeHero'; -import { HomeStepperSection } from '@/app/[locale]/(home)/_components/HomeStepperSection'; -import { Menu, MENU_DATA } from '@/sections/Menu'; -import { HomeTestimonials } from '@/app/[locale]/(home)/_components/HomeTestimonials'; -import { HomeFeatureThreeCards } from '@/app/[locale]/(home)/_components/HomeFeatureThreeCards'; -import { HomeIllustrationThreeCards } from '@/app/[locale]/(home)/_components/HomeIllustrationThreeCards'; -import { buildFaqPageJsonLd, buildRouteMetadata, JsonLd } from '@/lib/seo'; - -export const generateMetadata = buildRouteMetadata('home'); - -const HOME_TOP_BACKGROUND_COLOR = '#F4F4F4'; - -type HomePageProps = { - params: Promise; -}; - -export default async function HomePage({ params }: HomePageProps) { - const [i18n, stats] = await Promise.all([ - getRouteI18n(params), - fetchCommunityStats(), - ]); - - const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats); - - return ( - <> - i18n._(d))} /> - {/* - * Above-the-fold home hero background texture. Preload warms the - * HTTP cache so it is ready by the time HomeBackgroundHalftone - * binds it to the WebGL pipeline. - */} - - - - - - - - - - - - - - - - - - - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/(home)/testimonials.data.ts b/packages/twenty-website/src/app/[locale]/(home)/testimonials.data.ts deleted file mode 100644 index f3f33cd2cf..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/testimonials.data.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import type { TestimonialCardType } from '@/sections/Testimonials'; - -export const HOME_TESTIMONIALS: TestimonialCardType[] = [ - { - heading: msg`The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly.`, - author: { - name: msg`Olivier Reinaud`, - designation: msg`Co-founder at NetZero`, - }, - }, - { - heading: msg`We didn't want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind.`, - author: { - name: msg`Amrendra Pratap Singh`, - designation: msg`VP of Engineering at W3villa Technologies`, - }, - }, - { - heading: msg`It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not.`, - author: { - name: msg`Justin Beadle`, - designation: msg`Director of Digital and Information, Elevate Consulting`, - }, - }, -]; diff --git a/packages/twenty-website/src/app/[locale]/(home)/three-cards-feature.data.ts b/packages/twenty-website/src/app/[locale]/(home)/three-cards-feature.data.ts deleted file mode 100644 index a1285562fd..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/three-cards-feature.data.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import type { ThreeCardsFeatureCardType } from '@/sections/ThreeCards'; - -export const FEATURE_CARDS: ThreeCardsFeatureCardType[] = [ - { - heading: msg`Familiar, modern interface`, - body: msg`Twenty makes it simple. It's clean, intuitive, and built to feel like Notion.`, - backgroundImageSrc: - '/images/home/three-cards-feature/familiar-interface-gradient.webp', - icon: 'users-group', - illustration: 'familiar-interface', - }, - { - heading: msg`Live data and AI built`, - body: msg`Everything updates in real time, with AI chat always ready to help you move faster.`, - backgroundImageSrc: - '/images/home/three-cards-feature/live-data-gradient.webp', - icon: 'live-data', - illustration: 'live-data', - }, - { - heading: msg`Fast path to action`, - body: msg`Smart patterns, shortcuts, and layouts make everyday tasks faster and easier to execute.`, - backgroundImageSrc: - '/images/home/three-cards-feature/fast-path-gradient.webp', - icon: 'fast-path', - illustration: 'fast-path', - }, -]; diff --git a/packages/twenty-website/src/app/[locale]/(home)/three-cards-illustration.data.ts b/packages/twenty-website/src/app/[locale]/(home)/three-cards-illustration.data.ts deleted file mode 100644 index 0bed80b871..0000000000 --- a/packages/twenty-website/src/app/[locale]/(home)/three-cards-illustration.data.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import type { ThreeCardsIllustrationCardType } from '@/sections/ThreeCards'; - -export const ILLUSTRATION_CARDS: ThreeCardsIllustrationCardType[] = [ - { - heading: msg`Production grade quality`, - body: msg`W3villa used Twenty as a production-grade framework for the data model, permissions, authentication, and workflow engine they would otherwise have rebuilt themselves.`, - benefits: undefined, - attribution: { - role: msg`VP of Engineering`, - company: msg`W3villa Technologies`, - }, - illustration: 'diamond', - caseStudySlug: 'w3villa', - }, - { - heading: msg`AI for rapid iterations`, - body: msg`Alternative Partners used agentic AI to compress what would typically be weeks of Salesforce migration work into something a single person could oversee.`, - benefits: undefined, - attribution: { - role: msg`Principal and Founder`, - company: msg`Alternative Partners`, - }, - illustration: 'flash', - caseStudySlug: 'alternative-partners', - }, - { - heading: msg`Control without drag`, - body: msg`AC&T moved to a self-hosted Twenty instance with no vendor risk, no forced migration, and CRM costs reduced by more than 90%.`, - benefits: undefined, - attribution: { - role: msg`CRM Engineer`, - company: msg`AC&T Education Migration`, - }, - illustration: 'lock', - caseStudySlug: 'act-education', - }, -]; diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/customers/[slug]/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/customers/[slug]/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/customers/[slug]/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/customers/[slug]/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/customers/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/customers/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/customers/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/customers/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/enterprise/activate/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/enterprise/activate/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/enterprise/activate/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/enterprise/activate/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/layout.tsx b/packages/twenty-website/src/app/[locale]/(site)/layout.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/layout.tsx rename to packages/twenty-website/src/app/[locale]/(site)/layout.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/partners/list/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/partners/list/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/partners/list/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/partners/list/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/partners/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/partners/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/partners/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/partners/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/partners/profile/[slug]/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/partners/profile/[slug]/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/partners/profile/[slug]/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/partners/profile/[slug]/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/pricing/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/pricing/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/pricing/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/pricing/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/privacy-policy/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/privacy-policy/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/privacy-policy/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/privacy-policy/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/product/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/product/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/product/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/product/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/releases/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/releases/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/releases/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/releases/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/terms/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/terms/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/terms/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/terms/page.tsx diff --git a/packages/twenty-website-redone/src/app/[locale]/(site)/why-twenty/page.tsx b/packages/twenty-website/src/app/[locale]/(site)/why-twenty/page.tsx similarity index 100% rename from packages/twenty-website-redone/src/app/[locale]/(site)/why-twenty/page.tsx rename to packages/twenty-website/src/app/[locale]/(site)/why-twenty/page.tsx diff --git a/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx b/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx deleted file mode 100644 index 5fe88633ba..0000000000 --- a/packages/twenty-website/src/app/[locale]/articles/[slug]/page.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import type { Metadata } from 'next'; -import { notFound } from 'next/navigation'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; - -import { getPublishedArticle, getPublishedArticles } from '@/lib/articles'; -import { fetchCommunityStats } from '@/lib/community/fetch-community-stats'; -import { type LocaleRouteParams } from '@/lib/i18n/server'; -import { localeToUrlSegment, resolveLocaleParam } from '@/lib/i18n'; -import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels'; -import { buildArticleJsonLd, buildPageMetadata, JsonLd } from '@/lib/seo'; -import { ArticlesArticle } from '@/sections/Articles'; -import { Menu, MENU_DATA } from '@/sections/Menu'; -import { theme } from '@/theme'; - -type ArticleSlugParams = LocaleRouteParams & { slug: string }; - -type ArticlePageProps = { - params: Promise; -}; - -export const dynamicParams = false; - -export function generateStaticParams(): ArticleSlugParams[] { - return getPublishedArticles().map((post) => ({ - locale: localeToUrlSegment(SOURCE_LOCALE), - slug: post.slug, - })); -} - -export async function generateMetadata({ - params, -}: ArticlePageProps): Promise { - const { locale: rawLocale, slug } = await params; - const locale = resolveLocaleParam(rawLocale); - const post = getPublishedArticle(slug); - - if (locale !== SOURCE_LOCALE || !post) { - return { robots: { index: false, follow: false } }; - } - - return buildPageMetadata({ - locale, - path: `/articles/${post.slug}`, - title: { - id: `${post.title} | Twenty Articles`, - message: `${post.title} | Twenty Articles`, - }, - description: { id: post.description, message: post.description }, - locales: [SOURCE_LOCALE], - type: 'article', - extend: { authors: [{ name: post.author }] }, - }); -} - -export default async function ArticlePage({ params }: ArticlePageProps) { - const { locale: rawLocale, slug } = await params; - const locale = resolveLocaleParam(rawLocale); - const post = getPublishedArticle(slug); - - if (locale !== SOURCE_LOCALE || !post) { - notFound(); - } - - const stats = await fetchCommunityStats(); - const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats); - - return ( - <> - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/articles/_components/ArticlesHero.tsx b/packages/twenty-website/src/app/[locale]/articles/_components/ArticlesHero.tsx deleted file mode 100644 index 4bfe000755..0000000000 --- a/packages/twenty-website/src/app/[locale]/articles/_components/ArticlesHero.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { HeadingPart } from '@/design-system/components'; -import { HeroBody, HeroHeading, HeroSection } from '@/templates/Hero'; - -// Articles is English-only (SOURCE_LOCALE-gated), so the copy is literal. -export function ArticlesHero() { - return ( - - - Ideas on -
- open-source - CRM -
- - Ideas from the team building Twenty on open source CRM, GTM systems, and - building software that lasts. - -
- ); -} diff --git a/packages/twenty-website/src/app/[locale]/articles/page.tsx b/packages/twenty-website/src/app/[locale]/articles/page.tsx deleted file mode 100644 index e7df6bba64..0000000000 --- a/packages/twenty-website/src/app/[locale]/articles/page.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { notFound } from 'next/navigation'; -import { SOURCE_LOCALE } from 'twenty-shared/translations'; - -import { getPublishedArticles } from '@/lib/articles'; -import { fetchCommunityStats } from '@/lib/community/fetch-community-stats'; -import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels'; -import { resolveLocaleParam } from '@/lib/i18n'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { - buildArticleListJsonLd, - buildBreadcrumbListJsonLd, - buildRouteMetadata, - JsonLd, -} from '@/lib/seo'; -import { ArticlesIndex } from '@/sections/Articles'; -import { ArticlesHero } from '@/app/[locale]/articles/_components/ArticlesHero'; -import { Menu, MENU_DATA } from '@/sections/Menu'; -import { TrustedBy } from '@/sections/TrustedBy'; -import { css } from '@linaria/core'; - -export const generateMetadata = buildRouteMetadata('articles'); - -const ARTICLES_TOP_BACKGROUND_COLOR = '#F4F4F4'; - -const pageRevealClassName = css` - @keyframes articlesPageReveal { - from { - opacity: 0; - transform: translate3d(0, 20px, 0); - } - to { - opacity: 1; - transform: translate3d(0, 0, 0); - } - } - - background-color: ${ARTICLES_TOP_BACKGROUND_COLOR}; - - & > * { - animation: articlesPageReveal 720ms cubic-bezier(0.22, 1, 0.36, 1) both; - animation-delay: 80ms; - } - - @media (prefers-reduced-motion: reduce) { - & > * { - animation: none; - } - } -`; - -type ArticlesPageProps = { - params: Promise; -}; - -export default async function ArticlesPage({ params }: ArticlesPageProps) { - const { locale: rawLocale } = await params; - const locale = resolveLocaleParam(rawLocale); - - if (locale !== SOURCE_LOCALE) { - notFound(); - } - - // getRouteI18n sets the request-scoped i18n context that TrustedBy/Menu/ - // Articles read; this page's own copy is English-only (SOURCE_LOCALE-gated - // above), so the returned instance is intentionally unused here. - const [, stats] = await Promise.all([ - getRouteI18n(params), - fetchCommunityStats(), - ]); - const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats); - const posts = getPublishedArticles(); - - return ( - <> - - {posts.length > 0 ? ( - - ) : null} - - -
- - -
- - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx b/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx deleted file mode 100644 index 85c76b68cf..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/9dots/page.tsx +++ /dev/null @@ -1,141 +0,0 @@ -import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout'; -import { Heading, HeadingPart } from '@/design-system/components'; -import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { buildLocalizedMetadata } from '@/lib/seo'; -import { msg } from '@lingui/core/macro'; - -const HERO_IMAGE = CASE_STUDY_HERO_IMAGES.nineDots; - -const META_TITLE = msg`Homeseller, WhatsApp, and a CRM built around the business | Nine Dots & Twenty`; -const META_DESCRIPTION = msg`How Nine Dots Ventures rebuilt a Singapore real estate agency on Twenty with APIs, n8n, Grafana, and AI on top of 2,000+ WhatsApp messages a day.`; - -export const generateMetadata = buildLocalizedMetadata({ - path: '/customers/9dots', - title: META_TITLE, - description: META_DESCRIPTION, -}); - -type CaseStudyPageProps = { - params: Promise; -}; - -export default async function NineDotsCaseStudyPage({ - params, -}: CaseStudyPageProps) { - const i18n = await getRouteI18n(params); - - const caseStudy: CaseStudyData = { - meta: { - title: META_TITLE, - description: META_DESCRIPTION, - }, - hero: { - readingTime: '9 min', - title: ( - - - {i18n._(msg`A real estate agency on WhatsApp`)} - - {i18n._(msg`built a`)} -
- {i18n._(msg`CRM`)} - {i18n._(msg`around it`)} -
- ), - author: 'Mike Babiy & Azmat Parveen', - authorAvatarSrc: '/images/partner/testimonials/mike-babiy.webp', - authorRole: msg`Founder, Nine Dots Ventures`, - clientIcon: 'nine-dots', - heroImageSrc: HERO_IMAGE, - industry: msg`Real Estate`, - kpis: [ - { value: msg`150 hrs`, label: msg`Saved / month` }, - { value: msg`2,000+`, label: msg`Daily messages` }, - { value: msg`Q1 2026`, label: msg`Record quarter` }, - ], - quote: { - text: msg`Twenty lets us build a CRM around the business and not the business around the CRM.`, - author: 'Mike Babiy', - role: msg`Founder, Nine Dots Ventures`, - }, - }, - sections: [ - { - type: 'text', - eyebrow: msg`Homeseller`, - heading: ( - - - {i18n._(msg`When the channel is`)} - - - {i18n._(msg`the business`)} - - - ), - paragraphs: [ - msg`Homeseller is a high-volume real estate agency in Singapore, founded by one of the country's top-performing property agents. The whole operation runs on WhatsApp: no email, no calendars, just group chats, thousands of them, with clients, agents, and leads together.`, - msg`That works until you need to understand the business underneath. Which deals are stuck? Where are leads coming from? What is the close rate? With spreadsheets and a legacy custom CRM that could not keep up, those questions were nearly impossible to answer.`, - msg`Mike and Azmat from Nine Dots stepped in to fix that, not by changing how Homeseller works, but by building a system that finally fit around it.`, - ], - callout: - '"Twenty lets us build a CRM around the business and not the business around the CRM." - Mike Babiy, Founder, Nine Dots Ventures', - }, - { - type: 'text', - eyebrow: msg`Architecture`, - heading: ( - - - {i18n._(msg`The CRM as a`)} - - - {i18n._(msg`control hub`)} - - - ), - paragraphs: [ - msg`Nine Dots rebuilt Homeseller's operations on Twenty, with a custom data model shaped around their sales flow. Because Twenty is open and everything is accessible via API, they connected it to what the business actually needed: n8n for automated workflows (in-app workflows were not available at that time), Grafana for live dashboards fed from Twenty, and a custom AI layer to parse and extract structured insights from more than 2,000 WhatsApp messages a day.`, - msg`Homeseller kept their habits. WhatsApp stayed WhatsApp. What changed is that everything flowing through those conversations now lands in a structured system, tracked, classified, and visible in real time.`, - ], - callout: - '"Twenty is the heart of the system. Everything branches from it." - Azmat Parveen, Nine Dots Ventures', - }, - { - type: 'text', - eyebrow: msg`The result`, - heading: ( - - - {i18n._(msg`150 hours`)} - - - {i18n._(msg`saved every month`)} - - - ), - paragraphs: [ - msg`About 150 hours per month saved in manual operations. Real-time metrics for the business owner. Growth readiness without adding operational headcount. A team that can answer questions that used to take days to piece together.`, - msg`The full rollout landed in July 2025. Since then, Nine Dots built a Smart Assistant on top of the system, nudging agents with tasks, reminders, and on-demand market analysis. Some agents never open Twenty directly, yet they are powered by it, outperforming peers on manual processes alone. By Q1 2026, Homeseller had recorded its best sales quarter ever.`, - ], - }, - ], - tableOfContents: [ - msg`When the channel is the business`, - msg`The CRM as a control hub`, - msg`The result`, - ], - catalogCard: { - summary: msg`Nine Dots put Twenty at the center of Homeseller's stack with APIs, automation, and AI on top of WhatsApp-heavy operations.`, - date: msg`Jul 2025`, - }, - }; - - return ( - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCaseStudyPageLayout.tsx b/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCaseStudyPageLayout.tsx deleted file mode 100644 index f081ef9dda..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCaseStudyPageLayout.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { getCaseStudyPalette, type CaseStudyData } from '@/lib/customers'; -import { fetchCommunityStats } from '@/lib/community/fetch-community-stats'; -import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels'; -import { - CaseStudyBody, - CaseStudyHero, - CaseStudyHighlights, - CaseStudySectionNav, - CaseStudyTextBlock, - CaseStudyVisualBlock, -} from '@/sections/CaseStudy'; -import { Menu, MENU_DATA } from '@/sections/Menu'; -import { theme } from '@/theme'; - -import { CustomersCaseStudySignoff } from './CustomersCaseStudySignoff'; - -type CustomersCaseStudyPageLayoutProps = { - caseStudy: CaseStudyData; - path: string; -}; - -export async function CustomersCaseStudyPageLayout({ - caseStudy, - path, -}: CustomersCaseStudyPageLayoutProps) { - const stats = await fetchCommunityStats(); - const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats); - const palette = getCaseStudyPalette(path); - - let storySectionIndex = 0; - const sectionBlocks = caseStudy.sections.map((block, index) => { - if (block.type === 'text') { - const sectionId = `case-study-section-${storySectionIndex}`; - storySectionIndex += 1; - return ( - - ); - } - return ( - - ); - }); - - return ( - <> - - - - - - - {sectionBlocks} - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCaseStudySignoff.tsx b/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCaseStudySignoff.tsx deleted file mode 100644 index 9c4dd64d18..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCaseStudySignoff.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { Trans } from '@lingui/react/macro'; - -import { - HeadingPart, - LinkButton, - ResponsiveLineBreak, -} from '@/design-system/components'; -import { getServerI18n } from '@/lib/i18n/server'; -import { TalkToUsButton } from '@/sections/ContactCal'; -import { Signoff } from '@/templates/Signoff'; - -export function CustomersCaseStudySignoff() { - const i18n = getServerI18n(); - - return ( - - - Ready to grow - - with Twenty? - - - } - body={ - - Join the teams that chose to own their CRM. - - Start building with Twenty today. - - } - > - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCatalogHero.tsx b/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCatalogHero.tsx deleted file mode 100644 index a62183315d..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCatalogHero.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Trans } from '@lingui/react/macro'; - -import { HeadingPart } from '@/design-system/components'; -import { HeroBody, HeroHeading, HeroSection } from '@/templates/Hero'; - -export function CustomersCatalogHero() { - return ( - - - - See how teams -
- build - on Twenty -
-
- - - Real stories from real teams about how they shaped Twenty to fit their - workflow and accelerated their growth. - - -
- ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCatalogSignoff.tsx b/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCatalogSignoff.tsx deleted file mode 100644 index cbdfb2bfdb..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/_components/CustomersCatalogSignoff.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { Trans } from '@lingui/react/macro'; - -import { - HeadingPart, - LinkButton, - ResponsiveLineBreak, -} from '@/design-system/components'; -import { getServerI18n } from '@/lib/i18n/server'; -import { TalkToUsButton } from '@/sections/ContactCal'; -import { Signoff } from '@/templates/Signoff'; - -export function CustomersCatalogSignoff() { - const i18n = getServerI18n(); - - return ( - - Ready to build -
- your own story? - - } - body={ - - Join the teams that chose to own their CRM. - - Start building with Twenty today. - - } - > - - -
- ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/act-education/page.tsx b/packages/twenty-website/src/app/[locale]/customers/act-education/page.tsx deleted file mode 100644 index 9e0e0eb117..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/act-education/page.tsx +++ /dev/null @@ -1,147 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { buildLocalizedMetadata } from '@/lib/seo'; -import { Heading, HeadingPart } from '@/design-system/components'; -import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout'; - -const HERO_IMAGE = CASE_STUDY_HERO_IMAGES.actEducation; - -const META_TITLE = msg`Burned by vendor lock-in, AC&T built a CRM they actually own | Twenty`; -const META_DESCRIPTION = msg`How AC&T Education Migration and Flycoder replaced a shuttered vendor CRM with self-hosted Twenty, with 90%+ lower cost and full ownership.`; - -export const generateMetadata = buildLocalizedMetadata({ - path: '/customers/act-education', - title: META_TITLE, - description: META_DESCRIPTION, -}); - -type CaseStudyPageProps = { - params: Promise; -}; - -export default async function ActEducationCaseStudyPage({ - params, -}: CaseStudyPageProps) { - const i18n = await getRouteI18n(params); - - const caseStudy: CaseStudyData = { - meta: { - title: META_TITLE, - description: META_DESCRIPTION, - }, - hero: { - readingTime: '7 min', - title: ( - - - {i18n._(msg`A CRM they`)} - -
- - {i18n._(msg`actually own`)} - -
- ), - author: 'Joseph Chiang', - authorAvatarSrc: '/images/partner/testimonials/joseph-chiang.webp', - authorRole: msg`CRM Engineer, AC&T Education Migration`, - clientIcon: 'act-education', - heroImageSrc: HERO_IMAGE, - industry: msg`Education`, - kpis: [{ value: msg`90%+`, label: msg`Lower CRM cost` }], - }, - sections: [ - { - type: 'text', - eyebrow: msg`AC&T Education Migration`, - heading: ( - - - {i18n._(msg`When the vendor`)} - - - {i18n._(msg`pulled the plug`)} - - - ), - paragraphs: [ - msg`AC&T Education Migration (actimmi.com) is an education agency in Australia. They help international students with applications to education providers and visas. They had been on a previous CRM until the vendor shut the system down, leaving nothing but a CSV export.`, - msg`Whatever came next had to be something they could own.`, - ], - callout: - '"They did not want to learn someone else\'s system. They wanted to keep working the way they already did and make it smoother." - Joseph Chiang, CRM Engineer, AC&T Education Migration', - }, - { - type: 'text', - eyebrow: msg`Implementation`, - heading: ( - - - {i18n._(msg`No more renting someone else's`)} - - - {i18n._(msg`structure`)} - - - ), - paragraphs: [ - msg`They evaluated Salesforce, Zoho, Pipedrive, and SuiteCRM. Each came with the same tradeoffs: too expensive, too rigid, or too generic, and none fixed the underlying problem. They were still renting a structure they did not control.`, - msg`Flycoder, a full-stack development partner, helped them set up Twenty as a self-hosted instance shaped around how AC&T actually operates. The data model centers on students, not a generic contact-and-deal pipeline. Statuses update automatically: a workflow runs nightly to keep enrollment records current. Automated email reminders cover important dates. Adding a new record takes under a minute.`, - msg`The result is a system that fits how AC&T already worked, instead of the other way around.`, - ], - }, - { - type: 'text', - eyebrow: msg`Control`, - heading: ( - - - {i18n._(msg`Control without`)} - - - {i18n._(msg`the overhead`)} - - - ), - paragraphs: [ - msg`Self-hosted means AC&T carries no vendor risk: no pricing model that can change, no platform that can disappear, no forced migration. The system is theirs.`, - msg`Because everything is built on Twenty's open foundation, Flycoder could wire the exact logic AC&T needed without fighting the platform.`, - ], - }, - { - type: 'text', - eyebrow: msg`The result`, - heading: ( - - - {i18n._(msg`Costs down more than`)} - - {i18n._(msg`90%`)} - - ), - paragraphs: [ - msg`CRM costs dropped by more than 90%. Manual overhead tied to the old system is gone. For the first time, AC&T has a CRM they will not lose again.`, - msg`They did not just replace a tool. They took back ownership of how their business runs.`, - ], - }, - ], - tableOfContents: [ - msg`When the vendor pulled the plug`, - msg`No more renting someone else's structure`, - msg`Control without the overhead`, - msg`The result`, - ], - catalogCard: { - summary: msg`AC&T and Flycoder moved from a dead vendor export to self-hosted Twenty, with over 90% lower CRM cost and full control.`, - date: msg`2025`, - }, - }; - - return ( - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/alternative-partners/page.tsx b/packages/twenty-website/src/app/[locale]/customers/alternative-partners/page.tsx deleted file mode 100644 index 4012f0f1dc..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/alternative-partners/page.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { Heading, HeadingPart } from '@/design-system/components'; -import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { buildLocalizedMetadata } from '@/lib/seo'; -import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout'; - -const HERO_IMAGE = CASE_STUDY_HERO_IMAGES.alternativePartners; - -const META_TITLE = msg`From Salesforce to self-hosted Twenty, powered by AI | Alternative Partners`; -const META_DESCRIPTION = msg`How Alternative Partners migrated from Salesforce to self-hosted Twenty using agentic AI in the implementation loop: fast migration, durable ownership.`; - -export const generateMetadata = buildLocalizedMetadata({ - path: '/customers/alternative-partners', - title: META_TITLE, - description: META_DESCRIPTION, -}); - -type CaseStudyPageProps = { - params: Promise; -}; - -export default async function AlternativePartnersCaseStudyPage({ - params, -}: CaseStudyPageProps) { - const i18n = await getRouteI18n(params); - - const caseStudy: CaseStudyData = { - meta: { - title: META_TITLE, - description: META_DESCRIPTION, - }, - hero: { - readingTime: '7 min', - title: ( - - - {i18n._(msg`From Salesforce to`)} - -
- - {i18n._(msg`self-hosted Twenty`)} - -
- ), - author: 'Benjamin Reynolds', - authorAvatarSrc: '/images/partner/testimonials/benjamin-reynolds.webp', - authorRole: msg`Principal and Founder, Alternative Partners`, - clientIcon: 'alternative-partners', - heroImageSrc: HERO_IMAGE, - industry: msg`Consulting`, - kpis: [ - { value: msg`AI-assisted`, label: msg`Salesforce migration` }, - { value: msg`Self-hosted`, label: msg`Full ownership` }, - ], - }, - sections: [ - { - type: 'text', - eyebrow: msg`Alternative Partners`, - heading: ( - - - {i18n._(msg`AI in the`)} - - - {i18n._(msg`migration workflow`)} - - - ), - paragraphs: [ - msg`Alternative Partners is a consulting firm that moved from Salesforce to a self-hosted Twenty instance. Benjamin Reynolds led the migration. He had already become a Twenty expert implementing Twenty for one of Twenty's first cloud customers.`, - msg`His approach was unconventional. Instead of mapping fields manually, scripting transforms, and validating data step by step, he handed the job to agentic AI tools with a brief: where the data lives, the GitHub repo for the target platform, and the Railway deployment. Start, and only return if something breaks beyond a 70% confidence fix.`, - msg`It worked. This is AI-assisted iteration in practice: not AI as a product feature, but as part of implementation work, compressing what would typically be weeks into something one person can oversee without being the bottleneck.`, - ], - }, - { - type: 'text', - eyebrow: msg`Ownership`, - heading: ( - - - {i18n._(msg`Self-hosted`)} - - - {i18n._(msg`means control`)} - - - ), - paragraphs: [ - msg`The self-hosted setup means Alternative Partners owns the full stack: no vendor access to their data, no dependency on a SaaS pricing model, full control over how the system evolves. The migration was fast because of AI; the result is durable because the stack is open source.`, - ], - }, - ], - tableOfContents: [ - msg`AI in the migration workflow`, - msg`Self-hosted means control`, - ], - catalogCard: { - summary: msg`Alternative Partners replaced Salesforce with self-hosted Twenty, using agentic AI to compress migration work.`, - date: msg`2025`, - }, - }; - - return ( - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/elevate-consulting/page.tsx b/packages/twenty-website/src/app/[locale]/customers/elevate-consulting/page.tsx deleted file mode 100644 index 1a0bbb6717..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/elevate-consulting/page.tsx +++ /dev/null @@ -1,161 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { buildLocalizedMetadata } from '@/lib/seo'; -import { Heading, HeadingPart } from '@/design-system/components'; -import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout'; - -const HERO_IMAGE = CASE_STUDY_HERO_IMAGES.elevateConsulting; - -const META_TITLE = msg`Twenty as the API backbone of a go-to-market stack | Elevate Consulting`; -const META_DESCRIPTION = msg`How Elevate Consulting moved off documents and spreadsheets to Twenty as the API-connected CRM at the center of their stack.`; - -export const generateMetadata = buildLocalizedMetadata({ - path: '/customers/elevate-consulting', - title: META_TITLE, - description: META_DESCRIPTION, -}); - -type CaseStudyPageProps = { - params: Promise; -}; - -export default async function ElevateConsultingCaseStudyPage({ - params, -}: CaseStudyPageProps) { - const i18n = await getRouteI18n(params); - - const caseStudy: CaseStudyData = { - meta: { - title: META_TITLE, - description: META_DESCRIPTION, - }, - hero: { - readingTime: '8 min', - title: ( - - - {i18n._(msg`Twenty as the`)} - -
- - {i18n._(msg`API backbone`)} - - - {i18n._(msg`of a go-to-market stack`)} - -
- ), - author: 'Justin Beadle', - authorRole: msg`Director of Digital and Information, Elevate Consulting`, - clientIcon: 'elevate-consulting', - heroImageSrc: HERO_IMAGE, - industry: msg`Management Consulting`, - kpis: [ - { value: msg`1 click`, label: msg`Proposal automation` }, - { value: msg`4 tools`, label: msg`Connected via API` }, - { value: msg`API-first`, label: msg`Tool integration` }, - ], - quote: { - text: msg`It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other.`, - author: 'Justin Beadle', - role: msg`Director of Digital and Information, Elevate Consulting`, - }, - }, - sections: [ - { - type: 'text', - eyebrow: msg`The situation`, - heading: ( - - - {i18n._(msg`From documents to`)} - - - {i18n._(msg`open APIs`)} - - - ), - paragraphs: [ - msg`Elevate Consulting is a management consultancy based in Canada. When Justin Beadle, Director of Digital and Information, joined, the company ran entirely on Word documents, Excel spreadsheets, sticky notes, emails, and reliance on people. There was no CRM, no API-accessible tools, only a patchwork trying to stand in for a single source of truth.`, - msg`The CEO had resisted bringing in a CRM for years. The business development team had no experience using one, and the licensing costs of well-known CRMs like Salesforce or HubSpot were hard to justify without any guarantee of adoption: CRMs are only as good as the maintenance of the data inside them.`, - msg`In June 2025, Justin learned Twenty v1 had shipped. Within two or three days, the CEO asked him to look into setting up a CRM. The shift came from the potential of what could be built on top of fully open APIs. The timing was perfect.`, - ], - callout: - '"It is just such a nicer experience than dealing with a Salesforce or a HubSpot. My mission has been to get every tool API-accessible, so everything talks to each other. Twenty made that possible in a way older CRM platforms simply do not." - Justin Beadle, Director of Digital and Information, Elevate Consulting', - }, - { - type: 'text', - eyebrow: msg`Integration`, - heading: ( - - {i18n._(msg`One`)} - {i18n._(msg`API`)} - - {i18n._(msg`to rule them all`)} - - - ), - paragraphs: [ - msg`Justin's broader mission at Elevate has been to move the company off static documents and onto tools with API access. By the end of 2025, that was in place: time billing, resource planning, Microsoft Teams, and project management were all accessible via API, with Twenty at the center holding client and opportunity data. Team members could use that information strategically instead of re-keying it.`, - msg`That opened the door to something more powerful. Justin built a custom front end that pulls live data from those systems into a single view, tailored to each role. When a proposal is won, what used to require four separate people manually setting up instances across four different tools now happens in a single click, drawing on data collected in Twenty across the full opportunity lifecycle. It is another shift toward higher-value work for clients.`, - msg`Twenty is not only where CRM data lives. It is the API backbone that makes the rest of the stack possible.`, - ], - callout: - '"Because Twenty\'s API is fully open, I could connect it to every other tool in our stack. When a proposal is won, what used to take four people manually setting things up across four different tools now happens in a single click. That is the kind of time saving that only becomes possible when everything is connected." - Justin Beadle, Director of Digital and Information, Elevate Consulting', - }, - { - type: 'text', - eyebrow: msg`Adoption`, - heading: ( - - - {i18n._(msg`Workflows that`)} - - - {i18n._(msg`actually get used`)} - - - ), - paragraphs: [ - msg`The business development team finally had the CRM they had been asking for. Adoption came naturally: their data was already there when they logged in.`, - msg`Justin built workflows for notifications across the team, alerting the right people in Teams when a prospect becomes a lead or when project milestones are reached. Forms in Twenty let the business development team log activity without leaving the tool. The impact is real for the organization. The tool has been adaptable from opportunity-level work at a client to executive-level decisions.`, - msg`The flexibility to wire this together, without outside help and without fighting the platform, is what made it possible for a single person to stand up and maintain a connected stack across an entire consultancy.`, - ], - }, - { - type: 'text', - eyebrow: msg`What is next`, - heading: ( - - {i18n._(msg`Beyond`)} - - {i18n._(msg`internal rollout`)} - - - ), - paragraphs: [ - msg`Elevate's CEO was so impressed with Twenty he started recommending it to clients before the internal setup was even complete. The team is exploring bringing Twenty to client projects as part of their consulting practice, including as the backend for custom-built products tailored to specific operational needs.`, - msg`For a firm that once ran on sticky notes, this is more than an upgrade. It is a complete transformation.`, - ], - }, - ], - tableOfContents: [ - msg`From documents to open APIs`, - msg`One API to rule them all`, - msg`Workflows that actually get used`, - msg`What is next`, - ], - catalogCard: { - summary: msg`Elevate Consulting uses Twenty as the API backbone connecting billing, Teams, resourcing, and a custom front end around client and opportunity data.`, - date: msg`Jun 2025`, - }, - }; - - return ( - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/netzero/page.tsx b/packages/twenty-website/src/app/[locale]/customers/netzero/page.tsx deleted file mode 100644 index 0460f63a9e..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/netzero/page.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { buildLocalizedMetadata } from '@/lib/seo'; -import { Heading, HeadingPart } from '@/design-system/components'; -import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout'; - -const HERO_IMAGE = CASE_STUDY_HERO_IMAGES.netzero; - -const META_TITLE = msg`A CRM that grows with you | NetZero & Twenty`; -const META_DESCRIPTION = msg`How NetZero uses Twenty across carbon credits, agricultural products, and franchised industrial systems with a modular CRM and a roadmap toward AI-assisted workflows.`; - -export const generateMetadata = buildLocalizedMetadata({ - path: '/customers/netzero', - title: META_TITLE, - description: META_DESCRIPTION, -}); - -type CaseStudyPageProps = { - params: Promise; -}; - -export default async function NetZeroCaseStudyPage({ - params, -}: CaseStudyPageProps) { - const i18n = await getRouteI18n(params); - - const caseStudy: CaseStudyData = { - meta: { - title: META_TITLE, - description: META_DESCRIPTION, - }, - hero: { - readingTime: '8 min', - title: ( - - - {i18n._(msg`A CRM that`)} - -
- {i18n._(msg`grows`)} - {i18n._(msg`with you`)} -
- ), - author: 'Olivier Reinaud', - authorAvatarSrc: '/images/partner/testimonials/olivier-reinaud.webp', - authorRole: msg`Co-founder, NetZero`, - clientIcon: 'netzero', - heroImageSrc: HERO_IMAGE, - industry: msg`Agribusiness`, - kpis: [ - { value: msg`3 product lines`, label: msg`On a single CRM` }, - { value: msg`No-code`, label: msg`Customizations` }, - ], - }, - sections: [ - { - type: 'text', - eyebrow: msg`NetZero`, - heading: ( - - - {i18n._(msg`The right`)} - - - {i18n._(msg`foundation`)} - - - ), - paragraphs: [ - msg`NetZero works with the agro-industry, serving clients from multinationals to smallholder farmers. They sell carbon credits, agricultural products, and franchised industrial systems across three different product lines, multiple countries, and multiple company sizes. When Olivier Reinaud, co-founder of NetZero, started looking at CRMs in late 2024, he was not chasing the most feature-rich platform. He wanted the right foundation.`, - ], - callout: - '"Twenty delivers on what CRMs should have always been: fairly priced software with a fully modular and customizable model, a clean and modern UI, granular permissions, automations, enterprise features. A compelling solution with high potential to rightfully disrupt the CRM market." - Olivier Reinaud, co-founder of NetZero', - }, - { - type: 'text', - eyebrow: msg`Flexibility`, - heading: ( - - - {i18n._(msg`A business that does not fit a`)} - - {i18n._(msg`template`)} - - ), - paragraphs: [ - msg`What convinced Olivier was the flexibility of the platform and where it was headed. Even when initial needs were basic record-keeping, he still needed a custom data model with granular permissions to manage the wide range of NetZero activities. He also needed a system that could adapt quickly to a fast-iteration company.`, - msg`With Twenty, when a new need appears, he can address it himself: no developer required, no support ticket.`, - ], - callout: - '"The flexibility is really what made the difference. Our needs evolve very fast. I discover a new need and in two clicks I can address it. That is a real advantage when you are moving quickly." - Olivier Reinaud, co-founder of NetZero', - }, - { - type: 'text', - eyebrow: msg`Roadmap`, - heading: ( - - - {i18n._(msg`From simple to`)} - - {i18n._(msg`advanced`)} - - ), - paragraphs: [ - msg`Olivier recognizes that NetZero's current use of Twenty is still relatively simple: workflows and integrations are not yet as deep as he eventually wants, because he prioritized getting foundations right first.`, - msg`What is planned is significant. NetZero has a data lake, online forms, and multiple internal systems that he wants to connect to Twenty. The pipes are there; the next step is automations that tie them together.`, - msg`What is coming in April 2026 is what he has been waiting for: AI-assisted workflow creation, describing what he needs and iterating from there instead of building complex logic from scratch. For a founder who runs the CRM himself, that changes what is realistically possible.`, - ], - }, - { - type: 'text', - eyebrow: msg`Results`, - heading: ( - - - {i18n._(msg`The bet is`)} - - - {i18n._(msg`paying off`)} - - - ), - paragraphs: [ - msg`While NetZero still runs a second CRM in parallel for WhatsApp-heavy operations with farmers in Brazil, they expect to migrate all of it to Twenty as features and the ecosystem grow. Already, their structured, multinational pipeline is powered by Twenty.`, - msg`The early bet on the architecture is holding, and upcoming AI features are expected to make it even more relevant.`, - ], - }, - ], - tableOfContents: [ - msg`The right foundation`, - msg`A business that does not fit a template`, - msg`From simple to advanced`, - msg`The bet is paying off`, - ], - catalogCard: { - summary: msg`NetZero uses Twenty as a modular CRM across product lines and countries, with a roadmap into AI-assisted workflows.`, - date: msg`2025`, - }, - }; - - return ( - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/page.tsx b/packages/twenty-website/src/app/[locale]/customers/page.tsx deleted file mode 100644 index bc99e1f063..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/page.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { Faq } from '@/sections/Faq'; -import { TrustedBy } from '@/sections/TrustedBy'; -import { CASE_STUDY_CATALOG_ENTRIES } from '@/lib/customers'; -import { fetchCommunityStats } from '@/lib/community/fetch-community-stats'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels'; -import { CaseStudyCatalogGrid } from '@/sections/CaseStudyCatalog'; -import { CustomersCatalogHero } from '@/app/[locale]/customers/_components/CustomersCatalogHero'; -import { Menu, MENU_DATA } from '@/sections/Menu'; -import { CustomersCatalogSignoff } from '@/app/[locale]/customers/_components/CustomersCatalogSignoff'; -import { buildRouteMetadata } from '@/lib/seo'; -import { css } from '@linaria/core'; - -export const generateMetadata = buildRouteMetadata('customers'); - -const CUSTOMERS_TOP_BACKGROUND_COLOR = '#F4F4F4'; - -const pageRevealClassName = css` - @keyframes customersPageReveal { - from { - opacity: 0; - transform: translate3d(0, 20px, 0); - } - to { - opacity: 1; - transform: translate3d(0, 0, 0); - } - } - - background-color: ${CUSTOMERS_TOP_BACKGROUND_COLOR}; - - & > * { - animation: customersPageReveal 720ms cubic-bezier(0.22, 1, 0.36, 1) both; - animation-delay: 80ms; - } - - @media (prefers-reduced-motion: reduce) { - & > * { - animation: none; - } - } -`; - -type CaseStudiesCatalogPageProps = { - params: Promise; -}; - -export default async function CaseStudiesCatalogPage({ - params, -}: CaseStudiesCatalogPageProps) { - // getRouteI18n sets the request-scoped i18n context the page's components - // read; the page renders no copy of its own, so the instance is unused here. - const [, stats] = await Promise.all([ - getRouteI18n(params), - fetchCommunityStats(), - ]); - const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats); - - return ( - <> - - -
- - -
- - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/customers/w3villa/page.tsx b/packages/twenty-website/src/app/[locale]/customers/w3villa/page.tsx deleted file mode 100644 index 0f3451f552..0000000000 --- a/packages/twenty-website/src/app/[locale]/customers/w3villa/page.tsx +++ /dev/null @@ -1,146 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { CASE_STUDY_HERO_IMAGES, type CaseStudyData } from '@/lib/customers'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { buildLocalizedMetadata } from '@/lib/seo'; -import { Heading, HeadingPart } from '@/design-system/components'; -import { CustomersCaseStudyPageLayout } from '@/app/[locale]/customers/_components/CustomersCaseStudyPageLayout'; - -const HERO_IMAGE = CASE_STUDY_HERO_IMAGES.w3villa; - -const META_TITLE = msg`When your CRM is the product: W3Grads on Twenty | W3villa Technologies`; -const META_DESCRIPTION = msg`How W3villa Technologies shipped W3Grads, an AI mock interview platform for institutions, on Twenty as the operational backbone.`; - -export const generateMetadata = buildLocalizedMetadata({ - path: '/customers/w3villa', - title: META_TITLE, - description: META_DESCRIPTION, -}); - -type CaseStudyPageProps = { - params: Promise; -}; - -export default async function W3villaCaseStudyPage({ - params, -}: CaseStudyPageProps) { - const i18n = await getRouteI18n(params); - - const caseStudy: CaseStudyData = { - meta: { - title: META_TITLE, - description: META_DESCRIPTION, - }, - hero: { - readingTime: '8 min', - title: ( - - - {i18n._(msg`When your CRM is`)} - -
- - {i18n._(msg`the product`)} - -
- ), - author: 'Amrendra Pratap Singh', - authorAvatarSrc: '/images/partner/testimonials/amrendra-singh.webp', - authorRole: msg`VP of Engineering, W3villa Technologies`, - clientIcon: 'w3villa', - heroImageSrc: HERO_IMAGE, - industry: msg`EdTech`, - kpis: [{ value: msg`Zero`, label: msg`Manual work at core` }], - }, - sections: [ - { - type: 'text', - eyebrow: msg`W3Grads`, - heading: ( - - - {i18n._(msg`Scale without`)} - - - {i18n._(msg`breaking operations`)} - - - ), - paragraphs: [ - msg`Running mock interview programs for hundreds of students sounds straightforward. In practice, universities and training institutes hit the same wall: registrations entered by hand, interview links sent one by one, faculty reviewing every session without scoring or classification. At real scale, it breaks.`, - msg`W3villa Technologies set out to solve it properly, not with a workaround, but with a product.`, - ], - callout: - '"We did not want to patch over the problem. We wanted to build something institutions could rely on at scale, and that meant starting from a foundation solid enough to support the full complexity of what we had in mind." - Amrendra Pratap Singh, VP of Engineering, W3villa Technologies', - }, - { - type: 'text', - eyebrow: msg`Architecture`, - heading: ( - - - {i18n._(msg`Focus on the use case, not the`)} - - {i18n._(msg`plumbing`)} - - ), - paragraphs: [ - msg`W3villa built W3Grads (w3grads.com), an AI-powered mock interview platform for universities and training institutes, using Twenty as its operational backbone.`, - msg`The key decision was not to build everything from scratch. Twenty covers the data model, permissions, authentication, and workflow engine, the parts that would have taken months to rebuild, so the team could focus on product-specific logic.`, - msg`When a student registers via QR at a campus event, the system assigns a plan, generates an interview session, and sends a link. The AI conducts the interview, scores the candidate, and classifies the result. Faculty see where each student stands without manually reviewing every session. Building and iterating on these workflows was faster with AI in the loop.`, - ], - }, - { - type: 'text', - eyebrow: msg`Scale`, - heading: ( - - - {i18n._(msg`A platform ready to`)} - - {i18n._(msg`grow`)} - - ), - paragraphs: [ - msg`Because the foundation is solid, W3Grads is architected for what comes next, including a payment layer for future paid interview plans and nationwide scale without structural rewrites.`, - ], - callout: - '"Twenty gave us the flexibility to model the entire interview lifecycle as custom objects and workflows. We could build something genuinely complex without fighting the platform to do it." - Piyush Khandelwal, Director, W3villa Technologies, Partner', - }, - { - type: 'text', - eyebrow: msg`The result`, - heading: ( - - - {i18n._(msg`Zero manual work`)} - - - {i18n._(msg`at the core`)} - - - ), - paragraphs: [ - msg`Programs that previously needed heavy manual coordination now run end-to-end with automation. Institutions get a scalable, intelligent system; students get faster preparation for interviews that matter; W3villa shipped a product institutions can build revenue around.`, - msg`Zero manual work at the core. Full automation. Built on Twenty.`, - ], - }, - ], - tableOfContents: [ - msg`Scale without breaking operations`, - msg`Focus on the use case, not the plumbing`, - msg`A platform ready to grow`, - msg`The result`, - ], - catalogCard: { - summary: msg`W3villa shipped W3Grads on Twenty for AI interviews, scoring, and institution-scale workflows without rebuilding CRM plumbing.`, - date: msg`2025`, - }, - }; - - return ( - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/enterprise/activate/EnterpriseActivateClient.tsx b/packages/twenty-website/src/app/[locale]/enterprise/activate/EnterpriseActivateClient.tsx deleted file mode 100644 index 0f0ca3f0f8..0000000000 --- a/packages/twenty-website/src/app/[locale]/enterprise/activate/EnterpriseActivateClient.tsx +++ /dev/null @@ -1,247 +0,0 @@ -'use client'; - -import { msg } from '@lingui/core/macro'; -import { Trans } from '@lingui/react/macro'; -import { - BaseButton, - buttonBaseStyles, -} from '@/design-system/components/Button/BaseButton'; -import { Body, Heading, HeadingPart } from '@/design-system/components'; -import { useLingui } from '@lingui/react'; -import { useTimeoutRegistry } from '@/lib/react'; -import { theme } from '@/theme'; -import { css } from '@linaria/core'; -import { styled } from '@linaria/react'; -import { useSearchParams } from 'next/navigation'; -import { useState } from 'react'; - -import { useEnterpriseActivation } from './use-enterprise-activation'; - -const ContentStack = styled.div` - display: flex; - flex-direction: column; - gap: ${theme.spacing(6)}; -`; - -const ErrorBox = styled.div` - background-color: ${theme.colors.primary.border[5]}; - border: 1px solid ${theme.colors.accent.pink[70]}; - border-radius: ${theme.radius(2)}; - color: ${theme.colors.accent.pink[100]}; - font-family: ${theme.font.family.sans}; - font-size: ${theme.font.size(4)}; - line-height: 1.55; - padding: ${theme.spacing(4)}; -`; - -const successLeadClassName = css` - color: ${theme.colors.accent.green[100]}; -`; - -const LicenseeRow = styled.div` - align-items: baseline; - display: flex; - flex-wrap: wrap; - gap: ${theme.spacing(1)}; -`; - -const LicenseeValue = styled.span` - font-family: ${theme.font.family.sans}; - font-size: ${theme.font.size(4)}; - line-height: 1.55; -`; - -const KeySection = styled.div` - display: flex; - flex-direction: column; - gap: ${theme.spacing(2)}; -`; - -const KeyBlock = styled.div` - background-color: ${theme.colors.primary.border[5]}; - border: 1px solid ${theme.colors.primary.border[20]}; - border-radius: ${theme.radius(2)}; - font-family: ${theme.font.family.mono}; - font-size: ${theme.font.size(2)}; - line-height: 1.5; - padding: ${theme.spacing(4)}; - padding-right: ${theme.spacing(16)}; - position: relative; - word-break: break-all; -`; - -const CopyTrigger = styled.button<{ $copied: boolean }>` - ${buttonBaseStyles} - position: absolute; - right: ${theme.spacing(2)}; - top: ${theme.spacing(2)}; - - /* - * When showing the "Copied!" success state we override the inner - * BaseButton's appearance through its documented data-slot hooks. - * CSS rules cleanly win over SVG presentation attributes (fill on - * a path element) and over the Label's CSS-driven color, so no - * !important is needed for those. - * - * For the hover-fill we cannot override its inline opacity from CSS - * (inline style always wins) so we suppress it via visibility: hidden - * instead — that property is not set inline anywhere, so the cascade - * resolves correctly without !important. - */ - ${({ $copied }) => - $copied - ? ` - & [data-slot='button-base-shape'] path, - & [data-slot='button-base-shape'] rect { - fill: ${theme.colors.accent.green[100]}; - } - - & [data-slot='button-hover-fill'] { - visibility: hidden; - pointer-events: none; - } - - & [data-slot='button-label'], - &:is(:hover, :focus-visible) [data-slot='button-label'] { - color: ${theme.colors.primary.background[100]}; - } - ` - : ''} -`; - -const NextStepsBox = styled.div` - background-color: ${theme.colors.primary.border[5]}; - border: 1px solid ${theme.colors.primary.border[20]}; - border-left: 3px solid ${theme.colors.highlight[100]}; - border-radius: ${theme.radius(2)}; - display: flex; - flex-direction: column; - gap: ${theme.spacing(2)}; - padding: ${theme.spacing(4)}; -`; - -const NextStepsList = styled.ol` - display: flex; - flex-direction: column; - gap: ${theme.spacing(2)}; - list-style-position: outside; - margin: 0; - padding-left: ${theme.spacing(5)}; -`; - -const nextStepItemClassName = css` - &::marker { - color: ${theme.colors.primary.text[60]}; - font-weight: ${theme.font.weight.medium}; - } -`; - -export function EnterpriseActivateClient() { - const { i18n } = useLingui(); - const searchParams = useSearchParams(); - const sessionId = searchParams.get('session_id'); - const timeoutRegistry = useTimeoutRegistry(); - const { result, error, loading } = useEnterpriseActivation(sessionId); - const [copied, setCopied] = useState(false); - - const handleCopy = async () => { - if (!result) { - return; - } - - await navigator.clipboard.writeText(result.enterpriseKey); - setCopied(true); - timeoutRegistry.schedule(() => { - setCopied(false); - }, 2000); - }; - - return ( - - {loading && ( - - Activating your enterprise license… - - )} - - {error !== null && {error}} - - {result !== null && ( - <> - - - Your enterprise license has been activated successfully. - - - - - - Licensee: - {' '} - {result.licensee} - - - - - - Your enterprise key - - - - - Copy this key and paste it into your Twenty self-hosted instance - settings. - - - - - {result.enterpriseKey} - void handleCopy()} - type="button" - > - - - - - - - - - Next steps - - - -
  • - - Copy the enterprise key above. - -
  • -
  • - - - Open your Twenty self-hosted instance Settings → Enterprise. - - -
  • -
  • - - Paste the key and click Activate. - -
  • -
    -
    - - )} -
    - ); -} diff --git a/packages/twenty-website/src/app/[locale]/enterprise/activate/_components/EnterpriseActivateHero.tsx b/packages/twenty-website/src/app/[locale]/enterprise/activate/_components/EnterpriseActivateHero.tsx deleted file mode 100644 index d4c68f53a9..0000000000 --- a/packages/twenty-website/src/app/[locale]/enterprise/activate/_components/EnterpriseActivateHero.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { Trans } from '@lingui/react/macro'; - -import { Eyebrow, HeadingPart } from '@/design-system/components'; -import { HeroBody, HeroHeading, HeroSection } from '@/templates/Hero'; - -export function EnterpriseActivateHero() { - return ( - - - - Self-hosting - - - - - Enterprise - activation - - - - - Your checkout is complete. Follow the steps below to copy your license - key into your Twenty instance. - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/enterprise/activate/page.tsx b/packages/twenty-website/src/app/[locale]/enterprise/activate/page.tsx deleted file mode 100644 index 71c8856cf5..0000000000 --- a/packages/twenty-website/src/app/[locale]/enterprise/activate/page.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { msg } from '@lingui/core/macro'; -import { EnterpriseActivateClient } from '@/app/[locale]/enterprise/activate/EnterpriseActivateClient'; -import { Body, Container } from '@/design-system/components'; -import { fetchCommunityStats } from '@/lib/community/fetch-community-stats'; -import { getRouteI18n, type LocaleRouteParams } from '@/lib/i18n/server'; -import { mergeSocialLinkLabels } from '@/lib/community/merge-social-link-labels'; -import { EnterpriseActivateHero } from '@/app/[locale]/enterprise/activate/_components/EnterpriseActivateHero'; -import { Menu, MENU_DATA } from '@/sections/Menu'; -import { theme } from '@/theme'; -import { buildRouteMetadata } from '@/lib/seo'; -import { Suspense } from 'react'; -import { styled } from '@linaria/react'; - -export const generateMetadata = buildRouteMetadata('enterpriseActivate'); - -const ActivatePageContent = styled.section` - background-color: ${theme.colors.primary.background[100]}; - flex: 1; - padding-bottom: ${theme.spacing(20)}; - padding-top: ${theme.spacing(8)}; - width: 100%; -`; - -const ActivateContentInner = styled.div` - margin-left: auto; - margin-right: auto; - max-width: 640px; - width: 100%; -`; - -type EnterpriseActivateFallbackProps = { - loadingLabel: string; -}; - -function EnterpriseActivateFallback({ - loadingLabel, -}: EnterpriseActivateFallbackProps) { - return ( - - {loadingLabel} - - ); -} - -type EnterpriseActivatePageProps = { - params: Promise; -}; - -export default async function EnterpriseActivatePage({ - params, -}: EnterpriseActivatePageProps) { - const [i18n, stats] = await Promise.all([ - getRouteI18n(params), - fetchCommunityStats(), - ]); - const menuSocialLinks = mergeSocialLinkLabels(MENU_DATA.socialLinks, stats); - - return ( - <> - - - - - - - - - } - > - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/enterprise/activate/use-enterprise-activation.ts b/packages/twenty-website/src/app/[locale]/enterprise/activate/use-enterprise-activation.ts deleted file mode 100644 index 7f0fc55446..0000000000 --- a/packages/twenty-website/src/app/[locale]/enterprise/activate/use-enterprise-activation.ts +++ /dev/null @@ -1,80 +0,0 @@ -'use client'; - -import { useEffect, useState } from 'react'; - -type ActivationResult = { - enterpriseKey: string; - licensee: string; - subscriptionId: string; -}; - -type EnterpriseActivationState = { - error: string | null; - loading: boolean; - result: ActivationResult | null; -}; - -export function useEnterpriseActivation( - sessionId: string | null, -): EnterpriseActivationState { - const [result, setResult] = useState(null); - const [error, setError] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - if (!sessionId) { - setError('No session ID provided. Please complete the checkout first.'); - setLoading(false); - return; - } - - const abortController = new AbortController(); - - const activate = async () => { - try { - const response = await fetch( - `/api/enterprise/activate?session_id=${encodeURIComponent(sessionId)}`, - { signal: abortController.signal }, - ); - const data: { error?: string } & Partial = - await response.json(); - - if (abortController.signal.aborted) { - return; - } - - if (!response.ok) { - setError(data.error ?? 'Activation failed'); - return; - } - - if (data.enterpriseKey && data.licensee && data.subscriptionId) { - setResult({ - enterpriseKey: data.enterpriseKey, - licensee: data.licensee, - subscriptionId: data.subscriptionId, - }); - } else { - setError('Activation response was incomplete.'); - } - } catch { - if (abortController.signal.aborted) { - return; - } - setError('Failed to activate enterprise key. Please try again.'); - } finally { - if (!abortController.signal.aborted) { - setLoading(false); - } - } - }; - - void activate(); - - return () => { - abortController.abort(); - }; - }, [sessionId]); - - return { error, loading, result }; -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/ControlsPanel.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/ControlsPanel.tsx deleted file mode 100644 index 25d39e1b8e..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/ControlsPanel.tsx +++ /dev/null @@ -1,256 +0,0 @@ -'use client'; - -import type { ReactExportSettings } from '@/lib/halftone/utils/exporters'; -import { IconLayoutSidebarRightCollapse } from '@tabler/icons-react'; -import { styled } from '@linaria/react'; -import type { - HalftoneBackgroundSettings, - HalftoneGeometrySpec, - HalftoneSourceMode, - HalftoneStudioSettings, - HalftoneTabId, -} from '@/lib/halftone/utils/state'; -import { AnimationsTab } from './controls/AnimationsTab'; -import { DesignTab } from './controls/DesignTab'; -import { ExportTab } from './controls/ExportTab'; -import { PanelShell, TabButton, TabsBar } from './controls/controls-ui'; - -type ControlsPanelProps = { - activeTab: HalftoneTabId; - defaultExportName: string; - exportBackground: boolean; - exportName: string; - imageFileName: string | null; - onAnimationSettingsChange: ( - value: Partial, - ) => void; - onBackgroundChange: (value: Partial) => void; - onDashColorChange: (value: string) => void; - onHoverDashColorChange: (value: string) => void; - onCopyHalftoneImage: (width: number, height: number) => void; - onCopyHalftoneSvg: (width: number, height: number) => void; - onExportHalftoneImage: (width: number, height: number) => void; - onExportHalftoneSvg: (width: number, height: number) => void; - onExportBackgroundChange: (value: boolean) => void; - onExportHtml: () => void; - onExportNameChange: (value: string) => void; - onExportReact: () => void; - onImportPreset: () => void; - onReactAssetPublicUrlChange: (value: string) => void; - onReactExportSettingChange: ( - key: keyof ReactExportSettings, - value: boolean, - ) => void; - onHalftoneChange: ( - value: Partial, - ) => void; - onLightingChange: ( - value: Partial, - ) => void; - onMaterialChange: ( - value: Partial, - ) => void; - onPreviewDistanceChange: (value: number) => void; - onShapeChange: (value: string) => void; - onSourceModeChange: (value: HalftoneSourceMode) => void; - onTabChange: (value: HalftoneTabId) => void; - onToggleVisibility: () => void; - onUploadSource: () => void; - previewDistance: number; - reactAssetPublicUrl: string; - reactExportSettings: ReactExportSettings; - visible: boolean; - selectedShape: HalftoneGeometrySpec | undefined; - settings: HalftoneStudioSettings; - shapeOptions: Array<{ label: string; value: string }>; - defaultReactAssetPublicUrl: string; - showReactAssetPublicUrl: boolean; -}; - -const TABS: HalftoneTabId[] = ['design', 'animations', 'export']; - -const TAB_LABELS: Record = { - design: 'Design', - animations: 'Animations', - export: 'Export', -}; - -const TabsGroup = styled.div` - display: flex; - gap: 6px; - min-width: 0; -`; - -const TABLER_STROKE = 1.7; - -const PanelActions = styled.div` - display: inline-flex; - gap: 2px; - margin-left: auto; -`; - -const PanelActionButton = styled.button` - align-items: center; - background: transparent; - border: none; - border-radius: 7px; - color: rgba(255, 255, 255, 0.44); - cursor: pointer; - display: inline-flex; - font-family: inherit; - height: 28px; - justify-content: center; - padding: 0; - transition: - background-color 0.15s ease, - color 0.15s ease; - width: 28px; - - &:hover { - background: rgba(255, 255, 255, 0.08); - color: rgba(255, 255, 255, 0.74); - } - - &:focus-visible { - outline: 1px solid rgba(255, 255, 255, 0.35); - outline-offset: 1px; - } -`; - -const PanelToggleTabButton = styled(PanelActionButton)<{ $collapsed: boolean }>` - & > svg { - transform: ${(props) => (props.$collapsed ? 'scaleX(-1)' : 'none')}; - transition: transform 0.18s ease; - } -`; - -export function ControlsPanel({ - activeTab, - defaultExportName, - exportBackground, - exportName, - imageFileName, - onAnimationSettingsChange, - onBackgroundChange, - onDashColorChange, - onHoverDashColorChange, - onCopyHalftoneImage, - onCopyHalftoneSvg, - onExportHalftoneImage, - onExportHalftoneSvg, - onExportBackgroundChange, - onExportHtml, - onExportNameChange, - onExportReact, - onImportPreset, - onReactAssetPublicUrlChange, - onReactExportSettingChange, - onHalftoneChange, - onLightingChange, - onMaterialChange, - onPreviewDistanceChange, - onShapeChange, - onSourceModeChange, - onTabChange, - onToggleVisibility, - onUploadSource, - previewDistance, - reactAssetPublicUrl, - reactExportSettings, - visible, - selectedShape, - settings, - shapeOptions, - defaultReactAssetPublicUrl, - showReactAssetPublicUrl, -}: ControlsPanelProps) { - return ( - - - {visible ? ( - - {TABS.map((tab) => ( - onTabChange(tab)} - type="button" - > - {TAB_LABELS[tab]} - - ))} - - ) : null} - - - - - - - - {visible && activeTab === 'design' ? ( - - ) : null} - - {visible && activeTab === 'animations' ? ( - - ) : null} - - {visible && activeTab === 'export' ? ( - - ) : null} - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/HalftoneStudio.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/HalftoneStudio.tsx deleted file mode 100644 index b1170492d8..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/HalftoneStudio.tsx +++ /dev/null @@ -1,1242 +0,0 @@ -'use client'; - -import { ControlsPanel } from '@/app/[locale]/halftone/_components/ControlsPanel'; -import { - DEFAULT_REACT_EXPORT_SETTINGS, - deriveExportComponentName, - generateReactComponent, - generateStandaloneHtml, - getExportedModelFile, - parseExportedPreset, - type ReactExportSettings, -} from '@/lib/halftone/utils/exporters'; -import { resolveExportArtifactNames } from '@/lib/halftone/utils/export-names'; -import { generateImageHalftoneSvg } from '@/lib/halftone/utils/image-svg-export'; -import { - HalftoneCanvas, - type HalftoneSnapshotFn, -} from '@/lib/halftone/components/HalftoneCanvas'; -import { REFERENCE_PREVIEW_DISTANCE } from '@/lib/halftone/utils/footprint'; -import { - DEFAULT_IMAGE_HALFTONE_SETTINGS, - DEFAULT_SHAPE_HALFTONE_SETTINGS, - createInitialHalftoneStudioState, - halftoneStudioReducer, - type HalftoneExportPose, - type HalftoneGeometrySpec, - type HalftoneModelLoader, - type HalftoneSourceMode, - normalizeHalftoneStudioSettings, -} from '@/lib/halftone/utils/state'; -import { Logo as LogoIcon } from '@/icons'; -import { useTimeoutRegistry } from '@/lib/react'; -import { theme } from '@/theme'; -import { - useCallback, - useEffect, - useMemo, - useReducer, - useRef, - useState, -} from 'react'; - -import { CopyHalftoneShortcutEffect } from './effect-components/CopyHalftoneShortcutEffect'; -import { PasteImageEffect } from './effect-components/PasteImageEffect'; -import { useDefaultHalftoneImage } from '../_hooks/use-default-halftone-image'; -import { useGeometryLoader } from '../_hooks/use-geometry-loader'; -import { useImageElement } from '../_hooks/use-image-element'; - -import { - CanvasLayer, - ContentRegion, - ControlsPanelFrame, - ControlsPositioner, - HiddenFileInput, - Hint, - LogoLink, - Status, - StudioShell, -} from './halftone-studio.styles'; - -const STATUS_CLEAR_DELAY_MS = 2000; - -const DEFAULT_PREVIEW_DISTANCE = 6; -const DEFAULT_IMAGE_ASSET_PATH = '/images/shared/halftone/twenty-logo.svg'; -const DEFAULT_IMAGE_FILENAME = 'twenty-logo.svg'; -type PendingFilePicker = { - resolve: (file: File | null) => void; -}; - -type PendingPresetPicker = { - resolve: (files: File[]) => void; -}; - -function isLightColor(hex: string) { - const color = hex.replace('#', ''); - const r = parseInt(color.substring(0, 2), 16); - const g = parseInt(color.substring(2, 4), 16); - const b = parseInt(color.substring(4, 6), 16); - const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255; - - return luminance > 0.5; -} - -function downloadBlob(filename: string, blob: Blob) { - const anchor = document.createElement('a'); - anchor.href = URL.createObjectURL(blob); - anchor.download = filename; - anchor.click(); - - window.setTimeout(() => { - URL.revokeObjectURL(anchor.href); - }, 0); -} - -function downloadText(filename: string, content: string) { - downloadBlob(filename, new Blob([content], { type: 'text/plain' })); -} - -function getFilenameExtension( - filename: string | null | undefined, - fallbackExtension: string, -) { - const sanitizedFilename = filename?.split(/[?#]/, 1)[0] ?? ''; - const match = sanitizedFilename.match(/(\.[^.\\/]+)$/); - - return match?.[1] ?? fallbackExtension; -} - -function getAssetFilenameFromUrl(assetUrl: string, fallbackFilename: string) { - const sanitizedAssetUrl = assetUrl.split(/[?#]/, 1)[0].replace(/\/+$/, ''); - const assetFilename = sanitizedAssetUrl.split('/').filter(Boolean).pop(); - - return assetFilename && assetFilename.length > 0 - ? assetFilename - : fallbackFilename; -} - -function createInitialExportPose(): HalftoneExportPose { - return { - autoElapsed: 0, - rotateElapsed: 0, - rotationX: 0, - rotationY: 0, - rotationZ: 0, - targetRotationX: 0, - targetRotationY: 0, - timeElapsed: 0, - }; -} - -function normalizePresetAssetReference(reference: string | null) { - if (!reference) { - return null; - } - - const trimmed = reference.trim(); - - if (trimmed.startsWith('./data:')) { - return trimmed.slice(2); - } - - if (trimmed.startsWith('data:')) { - return trimmed; - } - - const withoutRelativePrefix = trimmed.replace(/^\.?\//, ''); - const pathSegments = withoutRelativePrefix.split('/').filter(Boolean); - - return pathSegments[pathSegments.length - 1] ?? withoutRelativePrefix; -} - -function findMatchingPresetAsset(files: File[], reference: string | null) { - const normalizedReference = normalizePresetAssetReference(reference); - - if (!normalizedReference || normalizedReference.startsWith('data:')) { - return null; - } - - const targetName = normalizedReference.toLowerCase(); - - return files.find((file) => file.name.toLowerCase() === targetName) ?? null; -} - -function inferPresetModelLoader( - reference: string | null, - fallbackLoader: HalftoneModelLoader | null, -) { - if (fallbackLoader) { - return fallbackLoader; - } - - const normalizedReference = normalizePresetAssetReference(reference) ?? ''; - - return normalizedReference.toLowerCase().endsWith('.fbx') ? 'fbx' : 'glb'; -} - -async function fileFromDataUrl(dataUrl: string, filename: string) { - const response = await fetch(dataUrl); - - if (!response.ok) { - throw new Error(`Could not load embedded asset ${filename}.`); - } - - const blob = await response.blob(); - - return new File([blob], filename, { - type: blob.type || 'application/octet-stream', - }); -} - -export function HalftoneStudio() { - const [state, dispatch] = useReducer( - halftoneStudioReducer, - undefined, - createInitialHalftoneStudioState, - ); - const [controlsVisible, setControlsVisible] = useState(true); - const [previewDistance, setPreviewDistance] = useState( - DEFAULT_PREVIEW_DISTANCE, - ); - const [exportBackground, setExportBackground] = useState(false); - const [exportName, setExportName] = useState(''); - const [reactExportSettings, setReactExportSettings] = - useState(DEFAULT_REACT_EXPORT_SETTINGS); - const [reactAssetPublicUrl, setReactAssetPublicUrl] = useState(''); - const [imageFile, setImageFile] = useState(null); - const [canvasInitialPose, setCanvasInitialPose] = - useState(); - const defaultImageFileReference = useRef(null); - const defaultImageFilePromiseReference = useRef | null>(null); - const snapshotReference = useRef(null); - const canvasLayerReference = useRef(null); - const fileInputReference = useRef(null); - const presetFileInputReference = useRef(null); - const pendingFilePickerReference = useRef(null); - const pendingPresetPickerReference = useRef(null); - const exportPoseReference = useRef( - createInitialExportPose(), - ); - const halftoneBySourceModeReference = useRef({ - shape: { ...DEFAULT_SHAPE_HALFTONE_SETTINGS }, - image: { ...DEFAULT_IMAGE_HALFTONE_SETTINGS }, - }); - const timeoutRegistry = useTimeoutRegistry(); - - const clearStatusLater = useCallback(() => { - timeoutRegistry.schedule( - () => dispatch({ type: 'clearStatus' }), - STATUS_CLEAR_DELAY_MS, - ); - }, [timeoutRegistry]); - - const imageElement = useImageElement(imageFile); - - const selectedShape = useMemo( - () => - state.geometrySpecs.find( - (shape) => shape.key === state.settings.shapeKey, - ), - [state.geometrySpecs, state.settings.shapeKey], - ); - - const geometryLoaderCallbacks = useMemo( - () => ({ - onLoadStart: (label: string) => - dispatch({ type: 'setStatus', message: `Loading ${label}…` }), - onLoadSuccess: () => dispatch({ type: 'clearStatus' }), - onLoadError: (message: string) => - dispatch({ type: 'setStatus', message, isError: true }), - onFallbackShape: (key: string) => - dispatch({ type: 'setShapeKey', value: key }), - }), - [], - ); - - const activeGeometry = useGeometryLoader( - selectedShape, - state.importedFiles, - geometryLoaderCallbacks, - ); - - const shapeOptions = useMemo( - () => - state.geometrySpecs.map((shape) => ({ - label: shape.label, - value: shape.key, - })), - [state.geometrySpecs], - ); - const selectedImportedFile = useMemo( - () => - getExportedModelFile( - selectedShape, - selectedShape ? state.importedFiles[selectedShape.key] : undefined, - ), - [selectedShape, state.importedFiles], - ); - const defaultExportName = useMemo(() => { - if (state.settings.sourceMode === 'image') { - if (!imageFile || imageFile.name === DEFAULT_IMAGE_FILENAME) { - return 'TwentyImage'; - } - - return deriveExportComponentName(undefined, imageFile); - } - - return deriveExportComponentName( - selectedShape, - selectedImportedFile ?? undefined, - ); - }, [ - imageFile, - selectedImportedFile, - selectedShape, - state.settings.sourceMode, - ]); - const exportArtifactNames = useMemo( - () => resolveExportArtifactNames(exportName, defaultExportName), - [defaultExportName, exportName], - ); - const reactExportUsesExternalAsset = useMemo( - () => - state.settings.sourceMode === 'image' || - selectedShape?.kind === 'imported', - [selectedShape?.kind, state.settings.sourceMode], - ); - const defaultReactAssetPublicUrl = useMemo(() => { - if (!reactExportUsesExternalAsset) { - return ''; - } - - const assetExtension = - state.settings.sourceMode === 'image' - ? getFilenameExtension( - imageFile?.name ?? DEFAULT_IMAGE_FILENAME, - '.svg', - ) - : getFilenameExtension( - selectedImportedFile?.name ?? selectedShape?.filename, - selectedShape?.loader === 'fbx' ? '.fbx' : '.glb', - ); - - return `/illustrations/generated/${exportArtifactNames.fileBaseName}${assetExtension}`; - }, [ - exportArtifactNames.fileBaseName, - imageFile?.name, - reactExportUsesExternalAsset, - selectedImportedFile?.name, - selectedShape?.filename, - selectedShape?.loader, - state.settings.sourceMode, - ]); - - useEffect(() => { - halftoneBySourceModeReference.current[state.settings.sourceMode] = { - ...state.settings.halftone, - }; - }, [state.settings.halftone, state.settings.sourceMode]); - - const handleCopyHalftoneImage = useCallback( - async (width: number, height: number) => { - const snapshotFn = snapshotReference.current; - - if (!snapshotFn) { - return; - } - - if ( - typeof ClipboardItem === 'undefined' || - typeof navigator.clipboard?.write !== 'function' - ) { - dispatch({ - type: 'setStatus', - message: 'Image clipboard copy is not supported in this browser.', - isError: true, - }); - return; - } - - const blob = await snapshotFn(width, height, { - backgroundColor: state.settings.background.color, - includeBackground: exportBackground, - }); - - if (!blob) { - dispatch({ - type: 'setStatus', - message: 'Could not copy the halftone image.', - isError: true, - }); - return; - } - - try { - await navigator.clipboard.write([ - new ClipboardItem({ - [blob.type || 'image/png']: blob, - }), - ]); - dispatch({ - type: 'setStatus', - message: 'Image copied to clipboard.', - }); - clearStatusLater(); - } catch { - dispatch({ - type: 'setStatus', - message: 'Could not copy the halftone image.', - isError: true, - }); - } - }, - [clearStatusLater, exportBackground, state.settings.background.color], - ); - - const openFilePicker = useCallback( - (accept: string) => { - return new Promise((resolve) => { - const input = fileInputReference.current; - - if (!input) { - resolve(null); - return; - } - - pendingFilePickerReference.current = { resolve }; - input.accept = accept; - - const handleWindowFocus = () => { - timeoutRegistry.schedule(() => { - const pendingPicker = pendingFilePickerReference.current; - const currentInput = fileInputReference.current; - - if (!pendingPicker) { - return; - } - - if (currentInput?.files?.length) { - return; - } - - pendingFilePickerReference.current = null; - pendingPicker.resolve(null); - }, 300); - }; - - window.addEventListener('focus', handleWindowFocus, { once: true }); - input.click(); - }); - }, - [timeoutRegistry], - ); - - const openPresetPicker = useCallback( - (accept: string) => { - return new Promise((resolve) => { - const input = presetFileInputReference.current; - - if (!input) { - resolve([]); - return; - } - - pendingPresetPickerReference.current = { resolve }; - input.accept = accept; - - const handleWindowFocus = () => { - timeoutRegistry.schedule(() => { - const pendingPicker = pendingPresetPickerReference.current; - const currentInput = presetFileInputReference.current; - - if (!pendingPicker) { - return; - } - - if (currentInput?.files?.length) { - return; - } - - pendingPresetPickerReference.current = null; - pendingPicker.resolve([]); - }, 300); - }; - - window.addEventListener('focus', handleWindowFocus, { once: true }); - input.click(); - }); - }, - [timeoutRegistry], - ); - - const handleFileInputChange = useCallback(() => { - const input = fileInputReference.current; - const pendingPicker = pendingFilePickerReference.current; - const file = input?.files?.[0] ?? null; - - if (!pendingPicker) { - if (input) { - input.value = ''; - } - - return; - } - - pendingFilePickerReference.current = null; - pendingPicker.resolve(file); - - if (input) { - input.value = ''; - } - }, []); - - const handlePresetFileInputChange = useCallback(() => { - const input = presetFileInputReference.current; - const pendingPicker = pendingPresetPickerReference.current; - const files = input?.files ? Array.from(input.files) : []; - - if (!pendingPicker) { - if (input) { - input.value = ''; - } - - return; - } - - pendingPresetPickerReference.current = null; - pendingPicker.resolve(files); - - if (input) { - input.value = ''; - } - }, []); - - const handleShapeChange = useCallback( - (key: string) => { - const shape = state.geometrySpecs.find( - (candidate) => candidate.key === key, - ); - - if (!shape) { - return; - } - - dispatch({ - type: 'setShapeKey', - value: key, - }); - }, - [state.geometrySpecs], - ); - - const activateUploadedModel = useCallback( - (file: File) => { - const currentDashColor = state.settings.halftone.dashColor; - const currentHoverDashColor = state.settings.halftone.hoverDashColor; - const extension = file.name.split('.').pop()?.toLowerCase(); - const loader = extension === 'glb' ? 'glb' : 'fbx'; - const nextShape: HalftoneGeometrySpec = { - key: `userUpload_${Date.now()}`, - label: file.name, - kind: 'imported', - loader, - filename: file.name, - description: `${loader.toUpperCase()} model`, - extensions: [`.${loader}`], - userProvided: true, - }; - - dispatch({ - type: 'registerImportedFile', - spec: nextShape, - file, - activate: true, - }); - halftoneBySourceModeReference.current[state.settings.sourceMode] = { - ...state.settings.halftone, - }; - dispatch({ type: 'setSourceMode', value: 'shape' }); - dispatch({ - type: 'patchHalftone', - value: { - ...halftoneBySourceModeReference.current.shape, - dashColor: currentDashColor, - hoverDashColor: currentHoverDashColor, - }, - }); - }, - [state.settings.halftone, state.settings.sourceMode], - ); - - const activateUploadedImage = useCallback( - (file: File) => { - const currentDashColor = state.settings.halftone.dashColor; - const currentHoverDashColor = state.settings.halftone.hoverDashColor; - setImageFile(file); - halftoneBySourceModeReference.current[state.settings.sourceMode] = { - ...state.settings.halftone, - }; - dispatch({ type: 'setSourceMode', value: 'image' }); - dispatch({ - type: 'patchHalftone', - value: { - ...halftoneBySourceModeReference.current.image, - dashColor: currentDashColor, - hoverDashColor: currentHoverDashColor, - }, - }); - }, - [state.settings.halftone, state.settings.sourceMode], - ); - - const handleUploadSource = useCallback(async () => { - const file = await openFilePicker( - '.fbx,.glb,.png,.jpg,.jpeg,.webp,.gif,.svg', - ); - - if (!file) { - return; - } - - if (/\.(png|jpe?g|webp|gif|svg)$/i.test(file.name)) { - activateUploadedImage(file); - return; - } - - activateUploadedModel(file); - }, [activateUploadedImage, activateUploadedModel, openFilePicker]); - - const loadDefaultImageFile = useCallback(async () => { - if (defaultImageFileReference.current) { - return defaultImageFileReference.current; - } - - if (!defaultImageFilePromiseReference.current) { - defaultImageFilePromiseReference.current = fetch(DEFAULT_IMAGE_ASSET_PATH) - .then(async (response) => { - if (!response.ok) { - throw new Error('Could not load the default image.'); - } - - const blob = await response.blob(); - const file = new File([blob], DEFAULT_IMAGE_FILENAME, { - type: blob.type || 'image/jpeg', - }); - - defaultImageFileReference.current = file; - - return file; - }) - .finally(() => { - defaultImageFilePromiseReference.current = null; - }); - } - - return defaultImageFilePromiseReference.current; - }, []); - - const handleSourceModeChange = useCallback( - (mode: HalftoneSourceMode) => { - if (mode !== state.settings.sourceMode) { - halftoneBySourceModeReference.current[state.settings.sourceMode] = { - ...state.settings.halftone, - }; - dispatch({ type: 'setSourceMode', value: mode }); - dispatch({ - type: 'patchHalftone', - value: { ...halftoneBySourceModeReference.current[mode] }, - }); - } - - if (mode !== 'image' || imageFile) { - return; - } - - void loadDefaultImageFile() - .then((file) => { - setImageFile((currentFile) => currentFile ?? file); - }) - .catch((error) => { - console.error(error); - }); - }, - [ - imageFile, - loadDefaultImageFile, - state.settings.halftone, - state.settings.sourceMode, - ], - ); - - const handleImportPreset = useCallback(async () => { - const selectedFiles = await openPresetPicker( - '.tsx,.html,.fbx,.glb,.png,.jpg,.jpeg,.webp,.gif,.svg', - ); - const presetFile = - selectedFiles.find((file) => /\.(tsx|html)$/i.test(file.name)) ?? null; - - if (!presetFile) { - return; - } - - try { - const preset = parseExportedPreset(await presetFile.text()); - const relatedFiles = selectedFiles.filter((file) => file !== presetFile); - const nextSettings = normalizeHalftoneStudioSettings(preset.settings); - let nextShapeKey = nextSettings.shapeKey; - const statusMessages: string[] = []; - - if (nextSettings.sourceMode === 'image') { - const matchedImageFile = findMatchingPresetAsset( - relatedFiles, - preset.imageAssetReference, - ); - const nextImageFile = - matchedImageFile ?? - (preset.imageAssetReference - ? await loadDefaultImageFile() - : (imageFile ?? (await loadDefaultImageFile()))); - - setImageFile(nextImageFile); - - if (!matchedImageFile && preset.imageAssetReference) { - const missingImageName = - normalizePresetAssetReference(preset.imageAssetReference) ?? - 'the exported image'; - statusMessages.push( - `${missingImageName} was not selected, so the default image is being used until you upload it.`, - ); - } - } else if (preset.shape.kind === 'imported') { - const embeddedModelReference = normalizePresetAssetReference( - preset.modelAssetReference, - ); - const matchedModelFile = embeddedModelReference?.startsWith('data:') - ? await fileFromDataUrl( - embeddedModelReference, - preset.shape.filename ?? `${preset.shape.label}.glb`, - ) - : findMatchingPresetAsset(relatedFiles, preset.modelAssetReference); - - if (matchedModelFile) { - const loader = inferPresetModelLoader( - matchedModelFile.name, - preset.shape.loader ?? null, - ); - const importedShapeSpec: HalftoneGeometrySpec = { - key: preset.shape.key, - label: matchedModelFile.name, - kind: 'imported', - loader, - filename: matchedModelFile.name, - description: `${loader.toUpperCase()} model`, - extensions: [`.${loader}`], - userProvided: true, - }; - - dispatch({ - type: 'registerImportedFile', - spec: importedShapeSpec, - file: matchedModelFile, - activate: false, - }); - nextShapeKey = importedShapeSpec.key; - } else { - nextShapeKey = 'torusKnot'; - - if (preset.shape.filename || preset.modelAssetReference) { - const missingModelName = - normalizePresetAssetReference( - preset.modelAssetReference ?? preset.shape.filename, - ) ?? preset.shape.label; - statusMessages.push( - `${missingModelName} was not selected, so Torus Knot is being shown until you upload the preset's model.`, - ); - } - } - } - - exportPoseReference.current = preset.initialPose; - setCanvasInitialPose(preset.initialPose); - const nextPreviewDistance = - preset.previewDistance ?? REFERENCE_PREVIEW_DISTANCE; - setPreviewDistance(nextPreviewDistance); - setExportName( - preset.componentName ?? presetFile.name.replace(/\.(tsx|html)$/i, ''), - ); - dispatch({ - type: 'replaceSettings', - value: { - ...nextSettings, - shapeKey: nextShapeKey, - }, - }); - dispatch({ - type: 'setStatus', - message: - statusMessages.length > 0 - ? `Imported ${presetFile.name}. ${statusMessages.join(' ')}` - : `Imported ${presetFile.name}.`, - }); - } catch (error) { - dispatch({ - type: 'setStatus', - message: - error instanceof Error - ? error.message - : 'Could not import that preset.', - isError: true, - }); - } - }, [imageFile, loadDefaultImageFile, openPresetPicker]); - - const handlePoseChange = useCallback((pose: HalftoneExportPose) => { - exportPoseReference.current = pose; - }, []); - - const handleReactExportSettingChange = useCallback( - (key: keyof ReactExportSettings, value: boolean) => { - setReactExportSettings((currentSettings) => ({ - ...currentSettings, - [key]: value, - })); - }, - [], - ); - - const handleExportReact = useCallback(() => { - const componentName = exportArtifactNames.componentName; - const kebabName = exportArtifactNames.fileBaseName; - const isImageMode = state.settings.sourceMode === 'image'; - const importedFile = selectedImportedFile; - const exportBackgroundColor = exportBackground - ? state.settings.background.color - : 'transparent'; - const effectiveReactAssetPublicUrl = - reactExportSettings.includePublicAssetUrl && reactExportUsesExternalAsset - ? reactAssetPublicUrl.trim() || defaultReactAssetPublicUrl - : undefined; - - const defaultModelFilename = importedFile - ? `${kebabName}${importedFile.name.replace(/^[^.]*/, '')}` - : undefined; - const modelFilename = - effectiveReactAssetPublicUrl && defaultModelFilename - ? getAssetFilenameFromUrl( - effectiveReactAssetPublicUrl, - defaultModelFilename, - ) - : defaultModelFilename; - - const defaultImageExportFilename = imageFile - ? `${kebabName}${imageFile.name.replace(/^[^.]*/, '')}` - : undefined; - const imageExportFilename = - effectiveReactAssetPublicUrl && defaultImageExportFilename - ? getAssetFilenameFromUrl( - effectiveReactAssetPublicUrl, - defaultImageExportFilename, - ) - : defaultImageExportFilename; - - downloadText( - `${componentName}.tsx`, - generateReactComponent(state.settings, selectedShape, componentName, { - assetUrl: effectiveReactAssetPublicUrl, - background: exportBackgroundColor, - imageFilename: imageExportFilename, - importedFile: importedFile ?? undefined, - initialPose: exportPoseReference.current, - modelFilenameOverride: modelFilename, - exportSettings: reactExportSettings, - previewDistance, - }), - ); - - if (isImageMode && imageFile) { - downloadBlob(imageExportFilename ?? imageFile.name, imageFile); - } else if (importedFile) { - downloadBlob(modelFilename ?? importedFile.name, importedFile); - } - }, [ - defaultReactAssetPublicUrl, - exportArtifactNames, - exportBackground, - imageFile, - previewDistance, - reactAssetPublicUrl, - reactExportSettings, - reactExportUsesExternalAsset, - selectedImportedFile, - selectedShape, - state.settings, - ]); - - const handleExportHalftoneImage = useCallback( - async (width: number, height: number) => { - const snapshotFn = snapshotReference.current; - const kebabName = exportArtifactNames.fileBaseName; - - if (!snapshotFn) { - return; - } - - const blob = await snapshotFn(width, height, { - backgroundColor: state.settings.background.color, - includeBackground: exportBackground, - }); - - if (!blob) { - return; - } - - downloadBlob(`${kebabName}-${width}x${height}.png`, blob); - }, - [ - exportArtifactNames.fileBaseName, - exportBackground, - state.settings.background.color, - ], - ); - - const buildHalftoneSvg = useCallback( - (width: number, height: number) => { - if (state.settings.sourceMode !== 'image' || !imageElement) { - return null; - } - - return generateImageHalftoneSvg({ - backgroundColor: state.settings.background.color, - image: imageElement, - includeBackground: exportBackground, - previewDistance, - settings: state.settings, - width, - height, - }); - }, - [exportBackground, imageElement, previewDistance, state.settings], - ); - - const handleExportHalftoneSvg = useCallback( - (width: number, height: number) => { - const svg = buildHalftoneSvg(width, height); - - if (!svg) { - dispatch({ - type: 'setStatus', - message: 'Could not export the halftone SVG.', - isError: true, - }); - return; - } - - downloadBlob( - `${exportArtifactNames.fileBaseName}-${width}x${height}.svg`, - new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }), - ); - dispatch({ - type: 'setStatus', - message: 'Halftone SVG downloaded.', - }); - clearStatusLater(); - }, - [buildHalftoneSvg, clearStatusLater, exportArtifactNames.fileBaseName], - ); - - const handleCopyHalftoneSvg = useCallback( - async (width: number, height: number) => { - const svg = buildHalftoneSvg(width, height); - - if (!svg) { - dispatch({ - type: 'setStatus', - message: 'Could not copy the halftone SVG.', - isError: true, - }); - return; - } - - const svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }); - - if ( - typeof ClipboardItem !== 'undefined' && - typeof navigator.clipboard?.write === 'function' - ) { - try { - await navigator.clipboard.write([ - new ClipboardItem({ - 'image/svg+xml': svgBlob, - 'text/plain': new Blob([svg], { type: 'text/plain' }), - }), - ]); - dispatch({ - type: 'setStatus', - message: 'SVG copied to clipboard.', - }); - clearStatusLater(); - return; - } catch { - // Fall through to plain-text clipboard copy below. - } - } - - if (typeof navigator.clipboard?.writeText === 'function') { - try { - await navigator.clipboard.writeText(svg); - dispatch({ - type: 'setStatus', - message: 'SVG markup copied to clipboard as text.', - }); - clearStatusLater(); - return; - } catch { - dispatch({ - type: 'setStatus', - message: 'Could not copy the halftone SVG.', - isError: true, - }); - return; - } - } - - dispatch({ - type: 'setStatus', - message: 'SVG clipboard copy is not supported in this browser.', - isError: true, - }); - }, - [buildHalftoneSvg, clearStatusLater], - ); - - const handleExportHtml = useCallback(async () => { - const componentName = exportArtifactNames.componentName; - const kebabName = exportArtifactNames.fileBaseName; - const isImageMode = state.settings.sourceMode === 'image'; - const importedFile = selectedImportedFile; - const exportBackgroundColor = exportBackground - ? state.settings.background.color - : 'transparent'; - - const modelFilename = importedFile - ? `${kebabName}${importedFile.name.replace(/^[^.]*/, '')}` - : undefined; - - const imageExportFilename = imageFile - ? `${kebabName}${imageFile.name.replace(/^[^.]*/, '')}` - : undefined; - - downloadText( - `${kebabName}.html`, - await generateStandaloneHtml( - state.settings, - selectedShape, - componentName, - { - background: exportBackgroundColor, - imageFilename: imageExportFilename, - importedFile: importedFile ?? undefined, - initialPose: exportPoseReference.current, - modelFilenameOverride: modelFilename, - previewDistance, - }, - ), - ); - - if (isImageMode && imageFile) { - downloadBlob(imageExportFilename ?? imageFile.name, imageFile); - } - }, [ - exportArtifactNames, - exportBackground, - imageFile, - previewDistance, - selectedImportedFile, - selectedShape, - state.settings, - ]); - - useDefaultHalftoneImage({ loadDefaultImageFile, setImageFile }); - - const background = state.settings.background.color; - const backgroundTone = isLightColor(background) ? 'light' : 'dark'; - const handleFirstInteraction = useCallback(() => { - dispatch({ type: 'hideHint' }); - }, []); - - const handlePasteImage = useCallback( - (file: File) => { - activateUploadedImage(file); - dispatch({ type: 'setStatus', message: 'Image pasted from clipboard.' }); - clearStatusLater(); - }, - [activateUploadedImage, clearStatusLater], - ); - - const handlePasteError = useCallback(() => { - dispatch({ - type: 'setStatus', - message: 'Could not read the pasted image.', - isError: true, - }); - }, []); - - const handleCopyShortcut = useCallback( - (width: number, height: number) => { - void handleCopyHalftoneImage(width, height); - }, - [handleCopyHalftoneImage], - ); - - return ( - - - - - - - - - - {state.settings.sourceMode === 'image' - ? 'Hover to relight the halftone' - : state.settings.animation.followDragEnabled - ? 'Click & drag to rotate' - : state.settings.animation.followHoverEnabled - ? 'Move the pointer to tilt the object' - : state.settings.animation.autoRotateEnabled - ? 'Idle auto-rotate is active' - : 'Open Animations to add motion'} - - 0} - > - {state.statusMessage} - - - - - - - - - - - dispatch({ type: 'patchAnimation', value }) - } - onDashColorChange={(value) => - dispatch({ - type: 'patchHalftone', - value: { dashColor: value }, - }) - } - onHoverDashColorChange={(value) => - dispatch({ - type: 'patchHalftone', - value: { hoverDashColor: value }, - }) - } - onCopyHalftoneImage={(width, height) => { - void handleCopyHalftoneImage(width, height); - }} - onExportHalftoneImage={(width, height) => { - void handleExportHalftoneImage(width, height); - }} - onExportHalftoneSvg={(width, height) => { - void handleExportHalftoneSvg(width, height); - }} - onCopyHalftoneSvg={(width, height) => { - void handleCopyHalftoneSvg(width, height); - }} - onExportBackgroundChange={setExportBackground} - onExportHtml={() => { - void handleExportHtml(); - }} - onExportNameChange={setExportName} - onExportReact={handleExportReact} - onReactAssetPublicUrlChange={setReactAssetPublicUrl} - onReactExportSettingChange={handleReactExportSettingChange} - onImportPreset={() => { - void handleImportPreset(); - }} - onBackgroundChange={(value) => - dispatch({ type: 'patchBackground', value }) - } - onHalftoneChange={(value) => - dispatch({ type: 'patchHalftone', value }) - } - onLightingChange={(value) => - dispatch({ type: 'patchLighting', value }) - } - onMaterialChange={(value) => - dispatch({ type: 'patchMaterial', value }) - } - onPreviewDistanceChange={setPreviewDistance} - onShapeChange={(value) => { - void handleShapeChange(value); - }} - onSourceModeChange={handleSourceModeChange} - onTabChange={(value) => dispatch({ type: 'setTab', value })} - onToggleVisibility={() => setControlsVisible((visible) => !visible)} - onUploadSource={() => { - void handleUploadSource(); - }} - previewDistance={previewDistance} - reactAssetPublicUrl={reactAssetPublicUrl} - reactExportSettings={reactExportSettings} - selectedShape={selectedShape} - settings={state.settings} - shapeOptions={shapeOptions} - defaultReactAssetPublicUrl={defaultReactAssetPublicUrl} - showReactAssetPublicUrl={ - reactExportSettings.includePublicAssetUrl && - reactExportUsesExternalAsset - } - visible={controlsVisible} - /> - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/AnimationsTab.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/AnimationsTab.tsx deleted file mode 100644 index 8d0b61722d..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/AnimationsTab.tsx +++ /dev/null @@ -1,749 +0,0 @@ -'use client'; - -import { - formatAngle, - formatDecimal, - formatPercent, -} from '@/lib/halftone/utils/formatters'; -import type { HalftoneStudioSettings } from '@/lib/halftone/utils/state'; -import { - ColorControlLabel, - ColorControlRow, - ColorField, - ControlGrid, - LabelWithTooltip, - Section, - SectionTitle, - SectionToggleHeader, - SelectControl, - SliderControl, - TabContent, - ToggleControl, -} from './controls-ui'; - -const MIN_ROTATION_SPEED = 0.01; -const ROTATION_SPEED_STEP = 0.01; - -type AnimationsTabProps = { - onAnimationSettingsChange: ( - value: Partial, - ) => void; - onHoverDashColorChange: (value: string) => void; - settings: HalftoneStudioSettings; -}; - -function effectLabel(label: string, description: string) { - return ; -} - -export function AnimationsTab({ - onAnimationSettingsChange, - onHoverDashColorChange, - settings, -}: AnimationsTabProps) { - const animation = settings.animation; - const isImageMode = settings.sourceMode === 'image'; - - return ( - - {isImageMode ? ( - <> -
    - - onAnimationSettingsChange({ - hoverHalftoneEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Hover Halftone', - 'Uses the cursor radius to locally push the halftone power and width, so the bars open or tighten around the mouse instead of only brightening.', - )} - - {animation.hoverHalftoneEnabled ? ( - - - onAnimationSettingsChange({ - hoverHalftonePowerShift: Number(event.target.value), - }) - } - step={0.01} - value={animation.hoverHalftonePowerShift} - valueLabel={formatDecimal( - animation.hoverHalftonePowerShift, - 2, - )} - > - Power shift - - - onAnimationSettingsChange({ - hoverHalftoneWidthShift: Number(event.target.value), - }) - } - step={0.01} - value={animation.hoverHalftoneWidthShift} - valueLabel={formatDecimal( - animation.hoverHalftoneWidthShift, - 2, - )} - > - Width shift - - - onAnimationSettingsChange({ - hoverHalftoneRadius: Number(event.target.value), - }) - } - step={0.01} - value={animation.hoverHalftoneRadius} - valueLabel={formatDecimal(animation.hoverHalftoneRadius, 2)} - > - Radius - - - Hover color - - - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - hoverLightEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Hover Light', - 'Turns the cursor into a moving light source so the halftone bars open up, tighten, and re-balance as you hover.', - )} - - {animation.hoverLightEnabled ? ( - - - onAnimationSettingsChange({ - hoverLightIntensity: Number(event.target.value), - }) - } - step={0.05} - value={animation.hoverLightIntensity} - valueLabel={formatDecimal(animation.hoverLightIntensity, 2)} - > - Intensity - - - onAnimationSettingsChange({ - hoverLightRadius: Number(event.target.value), - }) - } - step={0.01} - value={animation.hoverLightRadius} - valueLabel={formatDecimal(animation.hoverLightRadius, 2)} - > - Radius - - - ) : null} -
    - - ) : ( - <> -
    - Rotation - - - onAnimationSettingsChange({ - autoRotateEnabled: event.target.checked, - }) - } - /> - {animation.autoRotateEnabled ? ( - <> - - onAnimationSettingsChange({ - autoSpeed: Number(event.target.value), - }) - } - step={ROTATION_SPEED_STEP} - value={animation.autoSpeed} - valueLabel={formatDecimal(animation.autoSpeed, 2)} - > - Speed - - - onAnimationSettingsChange({ - autoWobble: Number(event.target.value), - }) - } - step={0.05} - value={animation.autoWobble} - valueLabel={formatDecimal(animation.autoWobble, 1)} - > - Wobble - - - ) : null} - - - onAnimationSettingsChange({ - rotateEnabled: event.target.checked, - }) - } - /> - {animation.rotateEnabled ? ( - <> - - onAnimationSettingsChange({ - rotatePreset: event.target - .value as HalftoneStudioSettings['animation']['rotatePreset'], - }) - } - options={[ - { label: 'Axis rotate', value: 'axis' }, - { label: 'Lissajous', value: 'lissajous' }, - { label: 'Orbit', value: 'orbit' }, - { label: 'Tumble', value: 'tumble' }, - ]} - value={animation.rotatePreset} - > - Pattern - - {animation.rotatePreset === 'axis' ? ( - - onAnimationSettingsChange({ - rotateAxis: event.target - .value as HalftoneStudioSettings['animation']['rotateAxis'], - }) - } - options={[ - { label: 'Y (horizontal)', value: 'y' }, - { label: '-Y (horizontal)', value: '-y' }, - { label: 'X (vertical)', value: 'x' }, - { label: '-X (vertical)', value: '-x' }, - { label: 'Z (roll)', value: 'z' }, - { label: '-Z (roll)', value: '-z' }, - { label: 'X + Y (diagonal)', value: 'xy' }, - { label: '-X + -Y (diagonal)', value: '-xy' }, - ]} - value={animation.rotateAxis} - > - Axis - - ) : null} - - onAnimationSettingsChange({ - rotateSpeed: Number(event.target.value), - }) - } - step={ROTATION_SPEED_STEP} - value={animation.rotateSpeed} - valueLabel={formatDecimal(animation.rotateSpeed, 2)} - > - Speed - - - onAnimationSettingsChange({ - rotatePingPong: event.target.checked, - }) - } - /> - - ) : null} - -
    - -
    - - onAnimationSettingsChange({ - floatEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Float + Drift', - 'Adds a gentle vertical bob plus a small rotational drift so the object feels suspended instead of locked in place.', - )} - - {animation.floatEnabled ? ( - - - onAnimationSettingsChange({ - floatSpeed: Number(event.target.value), - }) - } - step={0.05} - value={animation.floatSpeed} - valueLabel={formatDecimal(animation.floatSpeed, 2)} - > - Speed - - - onAnimationSettingsChange({ - floatAmplitude: Number(event.target.value), - }) - } - step={0.01} - value={animation.floatAmplitude} - valueLabel={formatDecimal(animation.floatAmplitude, 2)} - > - Height - - - onAnimationSettingsChange({ - driftAmount: Number(event.target.value), - }) - } - step={1} - value={animation.driftAmount} - valueLabel={formatAngle(animation.driftAmount)} - > - Drift - - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - breatheEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Breathing Scale', - 'Pulses the model scale in and out by a small amount to make static shapes feel alive.', - )} - - {animation.breatheEnabled ? ( - - - onAnimationSettingsChange({ - breatheSpeed: Number(event.target.value), - }) - } - step={0.05} - value={animation.breatheSpeed} - valueLabel={formatDecimal(animation.breatheSpeed, 2)} - > - Speed - - - onAnimationSettingsChange({ - breatheAmount: Number(event.target.value), - }) - } - step={0.005} - value={animation.breatheAmount} - valueLabel={formatPercent(animation.breatheAmount)} - > - Amount - - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - lightSweepEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Light Sweep', - 'Animates the primary light angle and height so highlights travel across the halftone surface.', - )} - - {animation.lightSweepEnabled ? ( - - - onAnimationSettingsChange({ - lightSweepSpeed: Number(event.target.value), - }) - } - step={0.05} - value={animation.lightSweepSpeed} - valueLabel={formatDecimal(animation.lightSweepSpeed, 2)} - > - Speed - - - onAnimationSettingsChange({ - lightSweepRange: Number(event.target.value), - }) - } - step={1} - value={animation.lightSweepRange} - valueLabel={formatAngle(animation.lightSweepRange)} - > - Angle - - - onAnimationSettingsChange({ - lightSweepHeightRange: Number(event.target.value), - }) - } - step={0.05} - value={animation.lightSweepHeightRange} - valueLabel={formatDecimal(animation.lightSweepHeightRange, 2)} - > - Height - - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - cameraParallaxEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Camera Parallax', - 'Moves the camera viewpoint with the cursor to create depth without directly rotating the object.', - )} - - {animation.cameraParallaxEnabled ? ( - - - onAnimationSettingsChange({ - cameraParallaxAmount: Number(event.target.value), - }) - } - step={0.01} - value={animation.cameraParallaxAmount} - valueLabel={formatDecimal(animation.cameraParallaxAmount, 2)} - > - Amount - - - onAnimationSettingsChange({ - cameraParallaxEase: Number(event.target.value), - }) - } - step={0.01} - value={animation.cameraParallaxEase} - valueLabel={formatDecimal(animation.cameraParallaxEase, 2)} - > - Easing - - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - springReturnEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Spring Return', - 'Changes the settling behavior so hover and drag interactions rebound and ease back like a spring instead of stopping flat.', - )} - - {animation.springReturnEnabled ? ( - - - onAnimationSettingsChange({ - springStrength: Number(event.target.value), - }) - } - step={0.01} - value={animation.springStrength} - valueLabel={formatDecimal(animation.springStrength, 2)} - > - Strength - - - onAnimationSettingsChange({ - springDamping: Number(event.target.value), - }) - } - step={0.02} - value={animation.springDamping} - valueLabel={formatDecimal(animation.springDamping, 2)} - > - Damping - - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - followHoverEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Follow Mouse (Hover)', - 'Tilts the object toward the pointer while the cursor is over the canvas.', - )} - - {animation.followHoverEnabled ? ( - - - onAnimationSettingsChange({ - hoverRange: Number(event.target.value), - }) - } - value={animation.hoverRange} - valueLabel={formatAngle(animation.hoverRange)} - > - Range - - - onAnimationSettingsChange({ - hoverEase: Number(event.target.value), - }) - } - step={0.01} - value={animation.hoverEase} - valueLabel={formatDecimal(animation.hoverEase, 2)} - > - Easing - - - onAnimationSettingsChange({ - hoverReturn: event.target.checked, - }) - } - /> - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - followDragEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Follow Mouse (Drag)', - 'Lets you rotate the object directly by dragging, optionally continuing with momentum after release.', - )} - - {animation.followDragEnabled ? ( - - - onAnimationSettingsChange({ - dragSens: Number(event.target.value), - }) - } - step={0.001} - value={animation.dragSens} - valueLabel={formatDecimal(animation.dragSens, 3)} - > - Sensitivity - - - onAnimationSettingsChange({ - dragFriction: Number(event.target.value), - }) - } - step={0.01} - value={animation.dragFriction} - valueLabel={formatDecimal(animation.dragFriction, 2)} - > - Friction - - - onAnimationSettingsChange({ - dragMomentum: event.target.checked, - }) - } - /> - - ) : null} -
    - -
    - - onAnimationSettingsChange({ - waveEnabled: event.target.checked, - }) - } - preserveCase - > - {effectLabel( - 'Wave', - 'Makes the halftone rows undulate horizontally for a liquid, organic feel.', - )} - - {animation.waveEnabled ? ( - - - onAnimationSettingsChange({ - waveSpeed: Number(event.target.value), - }) - } - step={0.1} - value={animation.waveSpeed} - valueLabel={formatDecimal(animation.waveSpeed, 1)} - > - Speed - - - onAnimationSettingsChange({ - waveAmount: Number(event.target.value), - }) - } - step={0.1} - value={animation.waveAmount} - valueLabel={formatDecimal(animation.waveAmount, 1)} - > - Amount - - - ) : null} -
    - - )} -
    - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ColorField.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ColorField.tsx deleted file mode 100644 index 41b1a4180e..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ColorField.tsx +++ /dev/null @@ -1,171 +0,0 @@ -'use client'; - -import { theme } from '@/theme'; -import { styled } from '@linaria/react'; -import { useEffect, useRef, useState } from 'react'; - -import { TAB_LABEL_WIDTH } from './controls-form-constants'; - -export const ColorControlRow = styled.div` - align-items: center; - display: grid; - gap: 10px; - grid-template-columns: ${TAB_LABEL_WIDTH}px minmax(0, 1fr); -`; - -export const ColorControlLabel = styled.span` - color: rgba(255, 255, 255, 0.7); - font-size: 11px; -`; - -export const ColorPickerField = styled.div` - align-items: center; - cursor: text; - display: flex; - gap: 8px; - justify-content: flex-end; - justify-self: end; - min-height: 16px; - min-width: fit-content; - padding: 0; - position: relative; - width: auto; -`; - -export const ColorSwatch = styled.span` - border: 1px solid rgba(255, 255, 255, 0.16); - border-radius: 4px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08); - flex-shrink: 0; - height: 16px; - width: 16px; -`; - -export const ColorHexInput = styled.input` - appearance: none; - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.85); - font-family: ${theme.font.family.mono}; - font-size: 11px; - height: 16px; - letter-spacing: 0.02em; - line-height: 16px; - min-width: 7ch; - outline: none; - padding: 0; - text-align: right; - text-transform: uppercase; - width: 7ch; - - &::placeholder { - color: rgba(255, 255, 255, 0.32); - } -`; - -export const ColorSwatchButton = styled.label` - align-items: center; - cursor: pointer; - display: inline-flex; - flex-shrink: 0; - height: 16px; - justify-content: center; - position: relative; -`; - -export const ColorInput = styled.input` - appearance: none; - border: none; - cursor: pointer; - height: 100%; - inset: 0; - outline: none; - opacity: 0; - padding: 0; - position: absolute; - width: 100%; -`; - -function normalizeHexColor(value: string): string | null { - const normalizedValue = value.trim().replace(/^#/, ''); - - if (!/^([0-9a-f]{3}|[0-9a-f]{6})$/i.test(normalizedValue)) { - return null; - } - - return `#${normalizedValue.toUpperCase()}`; -} - -type ColorFieldProps = { - ariaLabel: string; - onChange: (value: string) => void; - value: string; -}; - -export function ColorField({ ariaLabel, onChange, value }: ColorFieldProps) { - const normalizedValue = value.toUpperCase(); - const [draftValue, setDraftValue] = useState(normalizedValue); - const escapePressedReference = useRef(false); - - useEffect(() => { - setDraftValue(normalizedValue); - }, [normalizedValue]); - - const commitDraftValue = () => { - if (escapePressedReference.current) { - escapePressedReference.current = false; - return; - } - - const nextValue = normalizeHexColor(draftValue); - - if (!nextValue) { - setDraftValue(normalizedValue); - return; - } - - setDraftValue(nextValue); - - if (nextValue !== normalizedValue) { - onChange(nextValue); - } - }; - - return ( - - event.currentTarget.select()} - onChange={(event) => setDraftValue(event.target.value.toUpperCase())} - onFocus={(event) => event.currentTarget.select()} - onKeyDown={(event) => { - if (event.key === 'Enter') { - event.preventDefault(); - event.currentTarget.blur(); - } - - if (event.key === 'Escape') { - event.preventDefault(); - escapePressedReference.current = true; - setDraftValue(normalizedValue); - event.currentTarget.blur(); - } - }} - spellCheck={false} - type="text" - value={draftValue} - /> - - - onChange(event.target.value)} - type="color" - value={value} - /> - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsPanelShell.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsPanelShell.tsx deleted file mode 100644 index d134655387..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsPanelShell.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { theme } from '@/theme'; -import { styled } from '@linaria/react'; - -import { TAB_LABEL_WIDTH } from './controls-form-constants'; - -export const PanelShell = styled.aside<{ $collapsed?: boolean }>` - background: rgba(18, 18, 22, 0.88); - /* -webkit- prefix is required for the blur to render on Safari < 18. */ - -webkit-backdrop-filter: blur(24px) saturate(1.4); - backdrop-filter: blur(24px) saturate(1.4); - border: 1px solid rgba(255, 255, 255, 0.08); - border-radius: 16px; - box-shadow: - 0 24px 64px rgba(0, 0, 0, 0.4), - 0 0 0 1px rgba(255, 255, 255, 0.04) inset; - color: rgba(255, 255, 255, 0.7); - display: flex; - flex-direction: column; - font-family: ${theme.font.family.sans}; - font-size: 11px; - height: ${(props) => (props.$collapsed ? 'auto' : '100%')}; - overflow: hidden; - width: ${(props) => - props.$collapsed ? 'auto' : 'min(320px, calc(100vw - 32px))'}; - - @media (max-width: ${theme.breakpoints.md - 1}px) { - height: ${(props) => (props.$collapsed ? 'auto' : '100%')}; - width: ${(props) => (props.$collapsed ? 'auto' : '100%')}; - } -`; - -export const ControlGrid = styled.div` - display: grid; - gap: 10px; -`; - -export const ValueDisplay = styled.div` - align-items: center; - background-color: rgba(255, 255, 255, 0.07); - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 8px; - color: rgba(255, 255, 255, 0.85); - display: flex; - font-family: ${theme.font.family.sans}; - font-size: 11px; - min-height: 31px; - overflow: hidden; - padding: 7px 10px; - text-overflow: ellipsis; - white-space: nowrap; - width: 100%; -`; - -export const ShapeRow = styled.div` - align-items: center; - display: grid; - gap: 10px; - grid-template-columns: ${TAB_LABEL_WIDTH}px minmax(0, 1fr) auto; -`; - -export const UploadButton = styled.button` - align-items: center; - background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 8px; - color: rgba(255, 255, 255, 0.5); - cursor: pointer; - display: flex; - flex-shrink: 0; - font-size: 13px; - height: 24px; - justify-content: center; - transition: all 0.15s ease; - width: 24px; - - &:hover { - background: rgba(255, 255, 255, 0.12); - border-color: rgba(255, 255, 255, 0.22); - color: rgba(255, 255, 255, 0.8); - } -`; - -export const ExportNameInput = styled.input` - background: rgba(255, 255, 255, 0.07); - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 8px; - color: rgba(255, 255, 255, 0.85); - font-family: ${theme.font.family.sans}; - font-size: 11px; - margin-bottom: 14px; - outline: none; - padding: 7px 10px; - transition: border-color 0.15s ease; - width: 100%; - - &:hover { - border-color: rgba(255, 255, 255, 0.25); - } - - &:focus { - border-color: #4a38f5; - } - - &::placeholder { - color: rgba(255, 255, 255, 0.3); - } -`; - -export const ExportPreview = styled.div` - background: rgba(0, 0, 0, 0.4); - border: 1px solid rgba(255, 255, 255, 0.06); - border-radius: 10px; - color: rgba(255, 255, 255, 0.55); - font-family: ${theme.font.family.mono}; - font-size: 10px; - line-height: 1.5; - margin-bottom: 14px; - max-height: 200px; - overflow-y: auto; - padding: 12px; -`; - -export const ExportButton = styled.button<{ $primary?: boolean }>` - align-items: center; - background: ${(props) => - props.$primary ? 'rgba(255, 255, 255, 0.24)' : 'rgba(255, 255, 255, 0.2)'}; - border: none; - border-radius: 8px; - color: ${(props) => - props.$primary ? 'rgba(255, 255, 255, 0.92)' : 'rgba(255, 255, 255, 0.8)'}; - cursor: pointer; - display: flex; - font-family: ${theme.font.family.sans}; - font-size: 11px; - font-weight: ${theme.font.weight.medium}; - gap: 8px; - justify-content: center; - line-height: normal; - margin-top: ${(props) => (props.$primary ? '0' : '8px')}; - padding: 7px 12px; - transition: - background-color 0.15s ease, - color 0.15s ease, - transform 0.15s ease; - width: 100%; - - &:hover { - background: ${(props) => - props.$primary - ? 'rgba(255, 255, 255, 0.28)' - : 'rgba(255, 255, 255, 0.24)'}; - color: rgba(255, 255, 255, 0.92); - } - - &:active { - background: ${(props) => - props.$primary - ? 'rgba(255, 255, 255, 0.3)' - : 'rgba(255, 255, 255, 0.28)'}; - transform: translateY(1px); - } - - &:focus-visible { - outline: 1px solid rgba(255, 255, 255, 0.36); - outline-offset: 2px; - } - - &:disabled { - background: rgba(255, 255, 255, 0.1); - color: rgba(255, 255, 255, 0.36); - cursor: not-allowed; - transform: none; - } -`; - -export const ExportNote = styled.div` - color: rgba(255, 255, 255, 0.3); - font-size: 10px; - line-height: 1.5; - margin-top: 12px; -`; - -export const SmallBody = styled.p` - color: rgba(255, 255, 255, 0.45); - font-size: 10px; - line-height: 1.6; - margin-bottom: 14px; -`; diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsSections.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsSections.tsx deleted file mode 100644 index ea6b024d69..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsSections.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { styled } from '@linaria/react'; -import { type ChangeEventHandler, type ReactNode, useId } from 'react'; - -import { Toggle, ToggleInput, ToggleTrack } from './ToggleControl'; - -export const Section = styled.section<{ $first?: boolean }>` - border-top: ${(props) => - props.$first ? 'none' : '1px solid rgba(255, 255, 255, 0.06)'}; - margin-top: ${(props) => (props.$first ? '0' : '14px')}; - padding-top: ${(props) => (props.$first ? '0' : '14px')}; -`; - -export const SectionTitle = styled.div<{ $preserveCase?: boolean }>` - color: rgba(255, 255, 255, 0.36); - font-size: 10px; - font-weight: 600; - letter-spacing: ${(props) => (props.$preserveCase ? '0.02em' : '0.08em')}; - margin-bottom: 10px; - text-transform: ${(props) => (props.$preserveCase ? 'none' : 'uppercase')}; -`; - -export const SectionHeader = styled.div` - align-items: center; - display: flex; - justify-content: space-between; - margin-bottom: 10px; - - & > ${SectionTitle} { - margin-bottom: 0; - } -`; - -type SectionToggleHeaderProps = { - checked: boolean; - children: ReactNode; - onChange: ChangeEventHandler; - preserveCase?: boolean; -}; - -export function SectionToggleHeader({ - checked, - children, - onChange, - preserveCase, -}: SectionToggleHeaderProps) { - const titleId = useId(); - - return ( - - - {children} - - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsTabs.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsTabs.tsx deleted file mode 100644 index 06eedfbc88..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ControlsTabs.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { theme } from '@/theme'; -import { styled } from '@linaria/react'; - -export const TabsBar = styled.div<{ $collapsed?: boolean }>` - align-items: center; - display: flex; - flex-shrink: 0; - gap: 6px; - margin: 0; - padding: ${(props) => (props.$collapsed ? '12px' : '12px 12px 0')}; -`; - -export const TabButton = styled.button<{ $active: boolean }>` - background: ${(props) => - props.$active ? 'rgba(255, 255, 255, 0.08)' : 'transparent'}; - border: none; - border-radius: 7px; - color: ${(props) => - props.$active ? 'rgba(255, 255, 255, 0.94)' : 'rgba(255, 255, 255, 0.52)'}; - cursor: pointer; - font-family: ${theme.font.family.sans}; - font-size: 12px; - font-weight: ${(props) => (props.$active ? 600 : 500)}; - letter-spacing: 0; - line-height: 1; - padding: 8px 10px; - transition: - background-color 0.15s ease, - color 0.15s ease; - - &:hover { - background: ${(props) => - props.$active ? 'rgba(255, 255, 255, 0.1)' : 'rgba(255, 255, 255, 0.04)'}; - color: ${(props) => - props.$active - ? 'rgba(255, 255, 255, 0.94)' - : 'rgba(255, 255, 255, 0.74)'}; - } - - &:focus-visible { - outline: 1px solid rgba(255, 255, 255, 0.35); - outline-offset: 1px; - } -`; - -export const TabContent = styled.div` - flex: 1; - overflow-y: auto; - padding: 16px; -`; diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/DesignTab.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/DesignTab.tsx deleted file mode 100644 index d4cc8ad83e..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/DesignTab.tsx +++ /dev/null @@ -1,538 +0,0 @@ -'use client'; - -import { formatAngle, formatDecimal } from '@/lib/halftone/utils/formatters'; -import { - DEFAULT_GLASS_ANIMATION_SETTINGS, - DEFAULT_GLASS_LIGHTING_SETTINGS, - DEFAULT_GLASS_MATERIAL_SETTINGS, - DEFAULT_SOLID_ANIMATION_SETTINGS, - DEFAULT_SOLID_LIGHTING_SETTINGS, - DEFAULT_SOLID_MATERIAL_SETTINGS, - type HalftoneBackgroundSettings, - type HalftoneSourceMode, - type HalftoneStudioSettings, -} from '@/lib/halftone/utils/state'; -import { styled } from '@linaria/react'; -import { - ColorControlLabel, - ColorControlRow, - ColorField, - ControlGrid, - Section, - SectionTitle, - SectionToggleHeader, - SegmentedControl, - SelectInput, - ShapeRow, - SliderControl, - TabContent, - UploadButton, -} from './controls-ui'; - -const DEFAULT_IMAGE_FILE_NAME = 'twenty-logo.svg'; -const DEFAULT_IMAGE_OPTION_LABEL = 'Twenty image'; -const IMAGE_SOURCE_VALUE = '__image__'; - -const ColorSectionHeader = styled(ColorControlRow)` - margin-bottom: 10px; - - & > ${SectionTitle} { - margin-bottom: 0; - } -`; - -const ColorSwapButton = styled.button` - align-items: center; - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.34); - cursor: pointer; - display: inline-flex; - height: 16px; - justify-content: center; - padding: 0; - justify-self: end; - transition: color 0.15s ease; - width: 16px; - - &:hover { - color: rgba(255, 255, 255, 0.78); - } - - &:focus-visible { - outline: 1px solid rgba(255, 255, 255, 0.35); - outline-offset: 1px; - } -`; - -type DesignTabProps = { - onAnimationSettingsChange: ( - value: Partial, - ) => void; - imageFileName: string | null; - onBackgroundChange: (value: Partial) => void; - onDashColorChange: (value: string) => void; - onHalftoneChange: ( - value: Partial, - ) => void; - onLightingChange: ( - value: Partial, - ) => void; - onMaterialChange: ( - value: Partial, - ) => void; - onPreviewDistanceChange: (value: number) => void; - onShapeChange: (value: string) => void; - onSourceModeChange: (value: HalftoneSourceMode) => void; - onUploadSource: () => void; - previewDistance: number; - settings: HalftoneStudioSettings; - shapeOptions: Array<{ label: string; value: string }>; -}; - -function matchesSettings(value: T, target: T) { - return (Object.keys(target) as Array).every( - (key) => value[key] === target[key], - ); -} - -export function DesignTab({ - onAnimationSettingsChange, - imageFileName, - onBackgroundChange, - onDashColorChange, - onHalftoneChange, - onLightingChange, - onMaterialChange, - onPreviewDistanceChange, - onShapeChange, - onSourceModeChange, - onUploadSource, - previewDistance, - settings, - shapeOptions, -}: DesignTabProps) { - const isImageMode = settings.sourceMode === 'image'; - const selectedSourceValue = isImageMode - ? IMAGE_SOURCE_VALUE - : settings.shapeKey; - const imageOptionLabel = - imageFileName === null || imageFileName === DEFAULT_IMAGE_FILE_NAME - ? DEFAULT_IMAGE_OPTION_LABEL - : imageFileName; - - const handleSurfaceChange = (surface: 'glass' | 'solid') => { - const switchingToGlass = surface === 'glass'; - - onMaterialChange( - switchingToGlass - ? DEFAULT_GLASS_MATERIAL_SETTINGS - : DEFAULT_SOLID_MATERIAL_SETTINGS, - ); - - if (switchingToGlass) { - if (matchesSettings(settings.lighting, DEFAULT_SOLID_LIGHTING_SETTINGS)) { - onLightingChange(DEFAULT_GLASS_LIGHTING_SETTINGS); - } - - if ( - matchesSettings(settings.animation, DEFAULT_SOLID_ANIMATION_SETTINGS) - ) { - onAnimationSettingsChange(DEFAULT_GLASS_ANIMATION_SETTINGS); - } - - return; - } - - if (matchesSettings(settings.lighting, DEFAULT_GLASS_LIGHTING_SETTINGS)) { - onLightingChange(DEFAULT_SOLID_LIGHTING_SETTINGS); - } - - if (matchesSettings(settings.animation, DEFAULT_GLASS_ANIMATION_SETTINGS)) { - onAnimationSettingsChange(DEFAULT_SOLID_ANIMATION_SETTINGS); - } - }; - - const handleSwapColors = () => { - const nextDashColor = settings.background.color; - const nextBackgroundColor = settings.halftone.dashColor; - - onDashColorChange(nextDashColor); - onBackgroundChange({ color: nextBackgroundColor }); - }; - - return ( - -
    - Source - - - Source - { - const nextValue = event.target.value; - - if (nextValue === IMAGE_SOURCE_VALUE) { - onSourceModeChange('image'); - return; - } - - onSourceModeChange('shape'); - onShapeChange(nextValue); - }} - value={selectedSourceValue} - > - - {shapeOptions.map((option) => ( - - ))} - - - - - - - - - - - - - - -
    - -
    - Visualization - - - onPreviewDistanceChange(Number(event.target.value)) - } - step={0.1} - value={previewDistance} - valueLabel={formatDecimal(previewDistance, 1)} - > - Distance - - -
    - - {isImageMode ? ( -
    - Image - - - onHalftoneChange({ - imageContrast: Number(event.target.value), - }) - } - step={0.01} - value={settings.halftone.imageContrast} - valueLabel={formatDecimal(settings.halftone.imageContrast, 2)} - > - Contrast - - -
    - ) : ( - <> -
    - Lighting - - - onLightingChange({ intensity: Number(event.target.value) }) - } - step={0.1} - value={settings.lighting.intensity} - valueLabel={formatDecimal(settings.lighting.intensity, 1)} - > - Light - - - onLightingChange({ - fillIntensity: Number(event.target.value), - }) - } - step={0.01} - value={settings.lighting.fillIntensity} - valueLabel={formatDecimal(settings.lighting.fillIntensity)} - > - Fill - - - onLightingChange({ - ambientIntensity: Number(event.target.value), - }) - } - step={0.01} - value={settings.lighting.ambientIntensity} - valueLabel={formatDecimal(settings.lighting.ambientIntensity)} - > - Ambient - - - onLightingChange({ angleDegrees: Number(event.target.value) }) - } - value={settings.lighting.angleDegrees} - valueLabel={formatAngle(settings.lighting.angleDegrees)} - > - Angle - - - onLightingChange({ height: Number(event.target.value) }) - } - step={0.1} - value={settings.lighting.height} - valueLabel={formatDecimal(settings.lighting.height, 1)} - > - Height - - -
    - -
    - Material - - - handleSurfaceChange(value === 'glass' ? 'glass' : 'solid') - } - options={[ - { label: 'Solid', value: 'solid' }, - { label: 'Glass', value: 'glass' }, - ]} - value={settings.material.surface} - > - Surface - - - onMaterialChange({ roughness: Number(event.target.value) }) - } - step={0.01} - value={settings.material.roughness} - valueLabel={formatDecimal(settings.material.roughness)} - > - Roughness - - - onMaterialChange({ metalness: Number(event.target.value) }) - } - step={0.01} - value={settings.material.metalness} - valueLabel={formatDecimal(settings.material.metalness)} - > - Metalness - - {settings.material.surface === 'glass' ? ( - <> - - onMaterialChange({ - thickness: Number(event.target.value), - }) - } - step={0.1} - value={settings.material.thickness} - valueLabel={formatDecimal(settings.material.thickness, 0)} - > - Thickness - - - onMaterialChange({ - refraction: Number(event.target.value), - }) - } - step={0.01} - value={settings.material.refraction} - valueLabel={formatDecimal(settings.material.refraction)} - > - Refraction - - - onMaterialChange({ - environmentPower: Number(event.target.value), - }) - } - step={0.01} - value={settings.material.environmentPower} - valueLabel={formatDecimal( - settings.material.environmentPower, - 2, - )} - > - Power - - - ) : null} - -
    - - )} - -
    - - onHalftoneChange({ enabled: event.target.checked }) - } - > - Halftone - - {settings.halftone.enabled ? ( - - - onHalftoneChange({ - toneTarget: value === 'dark' ? 'dark' : 'light', - }) - } - options={[ - { label: 'Light', value: 'light' }, - { label: 'Dark', value: 'dark' }, - ]} - value={settings.halftone.toneTarget} - > - Areas - - - onHalftoneChange({ scale: Number(event.target.value) }) - } - step={0.01} - value={settings.halftone.scale} - valueLabel={formatDecimal(settings.halftone.scale, 2)} - > - Scale - - - onHalftoneChange({ power: Number(event.target.value) }) - } - step={0.01} - value={settings.halftone.power} - valueLabel={formatDecimal(settings.halftone.power, 2)} - > - Power - - - onHalftoneChange({ width: Number(event.target.value) }) - } - step={0.01} - value={settings.halftone.width} - valueLabel={formatDecimal(settings.halftone.width, 2)} - > - Width - - - ) : null} -
    - -
    - - Colors - - - - - - - Dash color - - - - Background - onBackgroundChange({ color: value })} - value={settings.background.color} - /> - - -
    -
    - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ExportTab.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ExportTab.tsx deleted file mode 100644 index 26dcf2fef5..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ExportTab.tsx +++ /dev/null @@ -1,390 +0,0 @@ -'use client'; - -import type { ReactExportSettings } from '@/lib/halftone/utils/exporters'; -import { resolveExportArtifactNames } from '@/lib/halftone/utils/export-names'; -import { formatAnimationName } from '@/lib/halftone/utils/formatters'; -import type { - HalftoneGeometrySpec, - HalftoneStudioSettings, -} from '@/lib/halftone/utils/state'; -import { useState } from 'react'; -import { - ExportButton, - ExportNameInput, - ExportNote, - ExportPreview, - LabelWithTooltip, - Section, - SectionTitle, - SelectControl, - TabContent, - ToggleControl, -} from './controls-ui'; - -const RESOLUTION_OPTIONS = [ - { label: '720p (1280 × 720)', value: '1280x720' }, - { label: '1080p (1920 × 1080)', value: '1920x1080' }, - { label: '2K (2560 × 1440)', value: '2560x1440' }, - { label: '4K (3840 × 2160)', value: '3840x2160' }, -]; -const DEFAULT_IMAGE_FILE_NAME = 'twenty-logo.svg'; -const DEFAULT_IMAGE_LABEL = 'Twenty image'; -const REACT_EXPORT_SETTING_OPTIONS: Array<{ - description: string; - key: keyof ReactExportSettings; - label: string; -}> = [ - { - key: 'includePublicAssetUrl', - label: 'Use public asset URL', - description: - 'Bakes the public asset path into the React export instead of using a relative file path.', - }, - { - key: 'includeStyledMount', - label: 'Use Linaria wrapper', - description: - 'Wraps the mount node with a StyledVisualMount using @linaria/react and keeps the Twenty-ready mount shape.', - }, - { - key: 'includeUseClientDirective', - label: "Add 'use client'", - description: - 'Prepends the Next.js client directive so the exported component can be dropped into the Twenty website directly.', - }, - { - key: 'includeTsNoCheck', - label: 'Add @ts-nocheck', - description: - 'Prepends // @ts-nocheck so generated self-contained files do not need hand-cleaning to satisfy strict TypeScript.', - }, - { - key: 'includeNamedAndDefaultExport', - label: 'Named + default export', - description: - 'Exports both a named component and a default export to match the current Twenty illustration import pattern.', - }, - { - key: 'includeRegistryComment', - label: 'Add Twenty header comment', - description: - 'Adds suggested destination and registry wiring comments at the top of the generated file.', - }, -]; - -function sectionLabel(label: string, description: string) { - return ; -} - -type ExportTabProps = { - defaultExportName: string; - exportBackground: boolean; - exportName: string; - imageFileName: string | null; - onCopyHalftoneImage: (width: number, height: number) => void; - onCopyHalftoneSvg: (width: number, height: number) => void; - onExportHalftoneImage: (width: number, height: number) => void; - onExportHalftoneSvg: (width: number, height: number) => void; - onExportBackgroundChange: (value: boolean) => void; - onExportHtml: () => void; - onExportNameChange: (value: string) => void; - onExportReact: () => void; - onImportPreset: () => void; - onReactAssetPublicUrlChange: (value: string) => void; - onReactExportSettingChange: ( - key: keyof ReactExportSettings, - value: boolean, - ) => void; - reactAssetPublicUrl: string; - reactExportSettings: ReactExportSettings; - selectedShape: HalftoneGeometrySpec | undefined; - settings: HalftoneStudioSettings; - defaultReactAssetPublicUrl: string; - showReactAssetPublicUrl: boolean; -}; - -export function ExportTab({ - defaultExportName, - exportBackground, - exportName, - imageFileName, - onCopyHalftoneImage, - onCopyHalftoneSvg, - onExportHalftoneImage, - onExportHalftoneSvg, - onExportBackgroundChange, - onExportHtml, - onExportNameChange, - onExportReact, - onImportPreset, - onReactAssetPublicUrlChange, - onReactExportSettingChange, - reactAssetPublicUrl, - reactExportSettings, - selectedShape, - settings, - defaultReactAssetPublicUrl, - showReactAssetPublicUrl, -}: ExportTabProps) { - const [resolution, setResolution] = useState('1920x1080'); - const isImageMode = settings.sourceMode === 'image'; - const animationLabel = formatAnimationName( - settings.animation, - settings.sourceMode, - ); - const sourceLabel = isImageMode - ? imageFileName === null || imageFileName === DEFAULT_IMAGE_FILE_NAME - ? DEFAULT_IMAGE_LABEL - : imageFileName - : (selectedShape?.label ?? settings.shapeKey); - const inputName = exportName || defaultExportName; - const { componentName } = resolveExportArtifactNames( - exportName, - defaultExportName, - ); - - const getSelectedResolution = () => { - const [widthStr, heightStr] = resolution.split('x'); - const width = parseInt(widthStr ?? '', 10); - const height = parseInt(heightStr ?? '', 10); - - return { width, height }; - }; - - const handleDownloadHalftoneImage = () => { - const { width, height } = getSelectedResolution(); - onExportHalftoneImage(width, height); - }; - - const handleCopyHalftoneImage = () => { - const { width, height } = getSelectedResolution(); - onCopyHalftoneImage(width, height); - }; - - const handleDownloadHalftoneSvg = () => { - const { width, height } = getSelectedResolution(); - onExportHalftoneSvg(width, height); - }; - - const handleCopyHalftoneSvg = () => { - const { width, height } = getSelectedResolution(); - onCopyHalftoneSvg(width, height); - }; - - return ( - -
    - - {sectionLabel( - 'Export Name', - 'Sets the base name used across the PNG, React component, and standalone HTML exports.', - )} - - - onExportNameChange(event.target.value)} - onClick={(event) => event.currentTarget.select()} - onFocus={(event) => event.currentTarget.select()} - placeholder={defaultExportName} - type="text" - value={inputName} - /> - - onExportBackgroundChange(event.target.checked)} - /> -
    - -
    - - {sectionLabel( - 'Image Export', - isImageMode - ? 'Downloads either a PNG snapshot or an SVG vector export of the current halftone effect, and can copy either format to the clipboard at the selected resolution.' - : 'Downloads a PNG snapshot of the current halftone effect or copies it to the clipboard at the selected resolution.', - )} - - - setResolution(event.target.value)} - options={RESOLUTION_OPTIONS} - value={resolution} - > - Resolution - - -
    - Download -
    - - PNG - - {isImageMode ? ( - - SVG - - ) : null} -
    -
    - -
    - Copy -
    - - PNG - - {isImageMode ? ( - - SVG - - ) : null} -
    -
    -
    - -
    - - {sectionLabel( - 'Code Exports', - 'Downloads either a self-contained React component or standalone HTML with the current design and animation settings baked in. React exports require three.', - )} - - - -
    - {`// ${componentName}.tsx`} -
    -
    - - {'// Auto-generated from current settings'} - -
    -
    -
    - import{' '} - {componentName}{' '} - from{' '} - {`'./${componentName}'`} -
    -
    -
    - {`// Source: ${sourceLabel}`} -
    -
    - {`// Public asset URL: ${reactExportSettings.includePublicAssetUrl ? 'on' : 'off'}`} -
    -
    - {`// Linaria wrapper: ${reactExportSettings.includeStyledMount ? 'on' : 'off'}`} -
    -
    - {`// use client: ${reactExportSettings.includeUseClientDirective ? 'on' : 'off'}`} -
    - {showReactAssetPublicUrl ? ( -
    - {`// Asset URL: ${reactAssetPublicUrl || defaultReactAssetPublicUrl}`} -
    - ) : null} -
    - {`// Animation: ${animationLabel}`} -
    -
    - {`// Dash color: ${settings.halftone.dashColor}`} -
    -
    - {`// Hover color: ${settings.halftone.hoverDashColor}`} -
    -
    - {`// Scale: ${settings.halftone.scale.toFixed(2)}`} -
    -
    - {`// Power: ${settings.halftone.power.toFixed(2)}`} -
    -
    - {`// Width: ${settings.halftone.width.toFixed(2)}`} -
    -
    - - {REACT_EXPORT_SETTING_OPTIONS.map((option) => ( - - onReactExportSettingChange(option.key, event.target.checked) - } - /> - ))} - - {showReactAssetPublicUrl ? ( -
    - - {sectionLabel( - 'Asset public URL', - 'Used as the baked-in public path for the downloaded image or model asset when "Use public asset URL" is enabled.', - )} - - - onReactAssetPublicUrlChange(event.target.value) - } - placeholder={defaultReactAssetPublicUrl} - type="text" - value={reactAssetPublicUrl} - /> -
    - ) : null} - - - Download React Component - - - Download Standalone HTML - - - - {isImageMode - ? 'The original image is downloaded alongside the export so the halftone effect can be rendered on top of it.' - : selectedShape?.kind === 'imported' - ? 'The standalone HTML export includes the current lighting, material, halftone, and animation settings, and embeds the uploaded model directly in the HTML file.' - : 'The standalone HTML export includes the current lighting, material, halftone, and animation settings.'} - -
    - -
    - - {sectionLabel( - 'Import Preset', - 'Loads a previously exported TSX or HTML halftone preset. If that preset depends on a separate image or model file, select that asset in the picker too.', - )} - - - - Import Exported Preset - -
    -
    - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/LabelWithTooltip.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/LabelWithTooltip.tsx deleted file mode 100644 index d673f066f0..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/LabelWithTooltip.tsx +++ /dev/null @@ -1,153 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { useEffect, useId, useRef, useState, type ReactNode } from 'react'; -import { createPortal } from 'react-dom'; - -import { TooltipPositionEffect } from './effect-components/TooltipPositionEffect'; - -const LabelWithInfoRow = styled.span` - align-items: center; - display: inline-flex; - gap: 6px; - min-width: 0; -`; - -const InfoTooltipRoot = styled.span` - display: inline-flex; - position: relative; -`; - -const InfoTooltipButton = styled.button` - align-items: center; - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.32); - cursor: help; - display: inline-flex; - height: 14px; - justify-content: center; - margin: 0; - padding: 0; - transition: color 0.15s ease; - width: 14px; - - &:hover, - &:focus-visible { - color: rgba(255, 255, 255, 0.7); - outline: none; - } - - &:hover + span, - &:focus-visible + span { - opacity: 1; - transform: translate(-50%, 0); - } -`; - -const InfoTooltipBubble = styled.span` - background: rgba(9, 9, 13, 0.96); - border: 1px solid rgba(255, 255, 255, 0.08); - border-radius: 10px; - box-shadow: 0 16px 40px rgba(0, 0, 0, 0.35); - color: rgba(255, 255, 255, 0.78); - font-size: 10px; - line-height: 1.45; - max-width: 220px; - padding: 8px 10px; - pointer-events: none; - position: fixed; - width: max-content; - z-index: 4; - - &::before { - background: rgba(9, 9, 13, 0.96); - border-left: 1px solid rgba(255, 255, 255, 0.08); - border-top: 1px solid rgba(255, 255, 255, 0.08); - content: ''; - height: 8px; - left: 50%; - position: absolute; - top: -5px; - transform: translateX(-50%) rotate(45deg); - width: 8px; - } -`; - -type LabelWithTooltipProps = { - description: string; - label: ReactNode; -}; - -export function LabelWithTooltip({ - description, - label, -}: LabelWithTooltipProps) { - const buttonReference = useRef(null); - const tooltipId = useId(); - const [isMounted, setIsMounted] = useState(false); - const [isOpen, setIsOpen] = useState(false); - const [tooltipPosition, setTooltipPosition] = useState({ - left: 0, - top: 0, - }); - - useEffect(() => { - setIsMounted(true); - }, []); - - return ( - - - {label} - - setIsOpen(false)} - onFocus={() => setIsOpen(true)} - onMouseEnter={() => setIsOpen(true)} - onMouseLeave={() => setIsOpen(false)} - ref={buttonReference} - type="button" - > - - - {isMounted && isOpen - ? createPortal( - - {description} - , - document.body, - ) - : null} - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SegmentedControl.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SegmentedControl.tsx deleted file mode 100644 index 8e54cd9740..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SegmentedControl.tsx +++ /dev/null @@ -1,128 +0,0 @@ -'use client'; - -import { theme } from '@/theme'; -import { styled } from '@linaria/react'; -import { useRef, type ReactNode } from 'react'; - -import { TAB_LABEL_WIDTH } from './controls-form-constants'; - -export const SegmentedLabel = styled.div` - align-items: center; - display: grid; - gap: 10px; - grid-template-columns: ${TAB_LABEL_WIDTH}px minmax(0, 1fr); -`; - -const SegmentedGroup = styled.div` - align-items: stretch; - background: rgba(255, 255, 255, 0.07); - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 8px; - display: grid; - gap: 1px; - grid-auto-columns: minmax(0, 1fr); - grid-auto-flow: column; - height: 24px; - padding: 1px; - width: 100%; -`; - -const SegmentedButton = styled.button<{ $active: boolean }>` - background: ${(props) => - props.$active ? 'rgba(255, 255, 255, 0.14)' : 'transparent'}; - border: none; - border-radius: 6px; - color: ${(props) => - props.$active ? 'rgba(255, 255, 255, 0.94)' : 'rgba(255, 255, 255, 0.58)'}; - cursor: pointer; - font-family: ${theme.font.family.sans}; - font-size: 11px; - font-weight: ${(props) => (props.$active ? 600 : 500)}; - height: 100%; - padding: 0 10px; - transition: - background-color 0.15s ease, - color 0.15s ease; - - &:hover { - color: rgba(255, 255, 255, 0.86); - } - - &:focus-visible { - outline: 1px solid rgba(255, 255, 255, 0.35); - outline-offset: 1px; - } -`; - -type SegmentedControlProps = { - children: ReactNode; - onChange: (value: string) => void; - value: string; - options: Array<{ label: string; value: string }>; -}; - -export function SegmentedControl({ - children, - onChange, - options, - value, -}: SegmentedControlProps) { - const groupReference = useRef(null); - - const handleKeyDown = (event: React.KeyboardEvent, currentIndex: number) => { - let nextIndex: number | null = null; - - if (event.key === 'ArrowRight' || event.key === 'ArrowDown') { - nextIndex = (currentIndex + 1) % options.length; - } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') { - nextIndex = (currentIndex - 1 + options.length) % options.length; - } - - if (nextIndex === null) { - return; - } - - event.preventDefault(); - onChange(options[nextIndex].value); - - const buttons = - groupReference.current?.querySelectorAll( - '[role="radio"]', - ); - buttons?.[nextIndex]?.focus(); - }; - - return ( - - {children} - - {options.map((option, index) => { - const isActive = option.value === value; - - return ( - { - if (!isActive) { - onChange(option.value); - } - }} - onKeyDown={(event) => handleKeyDown(event, index)} - role="radio" - tabIndex={isActive ? 0 : -1} - type="button" - > - {option.label} - - ); - })} - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SelectControl.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SelectControl.tsx deleted file mode 100644 index f0ae5eb101..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SelectControl.tsx +++ /dev/null @@ -1,73 +0,0 @@ -'use client'; - -import { theme } from '@/theme'; -import { styled } from '@linaria/react'; -import type { ChangeEventHandler, ReactNode } from 'react'; - -import { TAB_LABEL_WIDTH } from './controls-form-constants'; - -export const SelectLabel = styled.label` - align-items: center; - cursor: pointer; - display: grid; - gap: 10px; - grid-template-columns: ${TAB_LABEL_WIDTH}px minmax(0, 1fr); -`; - -export const SelectInput = styled.select` - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: rgba(255, 255, 255, 0.07); - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.52)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); - background-position: right 12px center; - background-repeat: no-repeat; - background-size: 12px 12px; - border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 8px; - color: rgba(255, 255, 255, 0.85); - cursor: pointer; - font-family: ${theme.font.family.sans}; - font-size: 11px; - height: 24px; - outline: none; - padding: 0 34px 0 10px; - transition: border-color 0.15s ease; - width: 100%; - - &:hover { - border-color: rgba(255, 255, 255, 0.25); - } - - &:focus-visible { - border-color: rgba(255, 255, 255, 0.4); - box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.15); - } -`; - -type SelectControlProps = { - children: ReactNode; - onChange: ChangeEventHandler; - value: string; - options: Array<{ label: string; value: string }>; -}; - -export function SelectControl({ - children, - onChange, - options, - value, -}: SelectControlProps) { - return ( - - {children} - - {options.map((option) => ( - - ))} - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SliderControl.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SliderControl.tsx deleted file mode 100644 index 4e8c2052b0..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/SliderControl.tsx +++ /dev/null @@ -1,279 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import { - useEffect, - useRef, - useState, - type ChangeEventHandler, - type ReactNode, -} from 'react'; - -import { TAB_LABEL_WIDTH } from './controls-form-constants'; - -export const SliderLabel = styled.label` - align-items: center; - cursor: pointer; - display: grid; - gap: 10px; - grid-template-columns: ${TAB_LABEL_WIDTH}px minmax(0, 1fr) auto; -`; - -export const ControlValue = styled.span` - color: rgba(255, 255, 255, 0.5); - font-size: 10px; - font-variant-numeric: tabular-nums; - min-width: 34px; - text-align: right; -`; - -export const SliderInput = styled.input<{ $fillPercent: number }>` - appearance: none; - background: transparent; - cursor: pointer; - height: 16px; - outline: none; - transition: transform 0.2s ease; - width: 100%; - -webkit-tap-highlight-color: transparent; - - &::-webkit-slider-runnable-track { - background: linear-gradient( - to right, - rgba(255, 255, 255, 0.35) ${({ $fillPercent }) => $fillPercent}%, - rgba(255, 255, 255, 0.08) ${({ $fillPercent }) => $fillPercent}% - ); - border-radius: 999px; - height: 6px; - } - - &::-webkit-slider-thumb { - appearance: none; - background: transparent; - border: none; - border-radius: 999px; - height: 16px; - margin-top: -5px; - width: 16px; - } - - &::-moz-range-progress { - background: rgba(255, 255, 255, 0.35); - border-radius: 999px; - height: 6px; - } - - &::-moz-range-thumb { - background: transparent; - border: none; - border-radius: 999px; - height: 16px; - width: 16px; - } - - &::-moz-range-track { - background: rgba(255, 255, 255, 0.08); - border-radius: 999px; - height: 6px; - } - - &:active { - transform: scaleY(2); - } -`; - -const EditableControlValueButton = styled.button` - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.5); - cursor: text; - font-family: inherit; - font-size: 10px; - font-variant-numeric: tabular-nums; - min-width: 34px; - padding: 0; - text-align: right; - - &:focus-visible { - outline: 1px solid rgba(255, 255, 255, 0.25); - outline-offset: 2px; - } -`; - -const EditableControlValueInput = styled.input` - appearance: textfield; - background: transparent; - border: none; - color: rgba(255, 255, 255, 0.62); - font-family: inherit; - font-size: 10px; - font-variant-numeric: tabular-nums; - min-width: 34px; - outline: none; - padding: 0; - text-align: right; - - &::-webkit-outer-spin-button, - &::-webkit-inner-spin-button { - appearance: none; - margin: 0; - } -`; - -function getStepPrecision(step: number | undefined) { - if (!step || Number.isInteger(step)) { - return 0; - } - - const stepString = step.toString().toLowerCase(); - - if (stepString.includes('e-')) { - const exponent = stepString.split('e-')[1]; - - return exponent ? Number.parseInt(exponent, 10) : 0; - } - - return stepString.split('.')[1]?.length ?? 0; -} - -function formatEditableValue(value: number, step: number | undefined) { - const precision = getStepPrecision(step); - - if (precision === 0) { - return String(Math.round(value)); - } - - return String(Number(value.toFixed(precision))); -} - -function clampAndSnapValue( - value: number, - min: number, - max: number, - step: number | undefined, -) { - const clampedValue = Math.min(Math.max(value, min), max); - - if (!step || step <= 0) { - return clampedValue; - } - - const precision = getStepPrecision(step); - const snappedValue = Math.round((clampedValue - min) / step) * step + min; - - return Number(Math.min(Math.max(snappedValue, min), max).toFixed(precision)); -} - -type SliderControlProps = { - children: ReactNode; - max: number; - min: number; - onChange: ChangeEventHandler; - step?: number; - value: number; - valueLabel: string; -}; - -export function SliderControl({ - children, - max, - min, - onChange, - step, - value, - valueLabel, -}: SliderControlProps) { - const [draftValue, setDraftValue] = useState(null); - const valueInputReference = useRef(null); - const fillPercent = ((value - min) / (max - min)) * 100; - const isEditing = draftValue !== null; - - useEffect(() => { - if (!isEditing) { - return; - } - - valueInputReference.current?.focus(); - valueInputReference.current?.select(); - }, [isEditing]); - - const commitDraftValue = () => { - if (draftValue === null) { - return; - } - - const trimmed = draftValue.trim(); - setDraftValue(null); - - if (trimmed === '') { - return; - } - - const nextValue = Number(trimmed); - - if (!Number.isFinite(nextValue)) { - return; - } - - const normalizedValue = clampAndSnapValue(nextValue, min, max, step); - - onChange({ - target: { value: String(normalizedValue) }, - } as React.ChangeEvent); - }; - - return ( - - {children} - - {isEditing ? ( - setDraftValue(event.target.value)} - onKeyDown={(event) => { - if (event.key === 'Enter') { - event.preventDefault(); - commitDraftValue(); - return; - } - - if (event.key === 'Escape') { - event.preventDefault(); - setDraftValue(null); - } - }} - ref={valueInputReference} - step={step} - type="number" - value={draftValue} - /> - ) : ( - { - event.preventDefault(); - event.stopPropagation(); - setDraftValue(formatEditableValue(value, step)); - }} - onMouseDown={(event) => { - event.preventDefault(); - event.stopPropagation(); - }} - type="button" - > - {valueLabel} - - )} - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ToggleControl.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ToggleControl.tsx deleted file mode 100644 index aa1ad13d5c..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/ToggleControl.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client'; - -import { styled } from '@linaria/react'; -import type { ChangeEventHandler, ReactNode } from 'react'; - -export const ToggleRow = styled.div` - align-items: center; - display: flex; - justify-content: space-between; - padding: 2px 0; -`; - -export const ToggleText = styled.span` - color: rgba(255, 255, 255, 0.7); - font-size: 11px; -`; - -export const Toggle = styled.label` - display: block; - flex-shrink: 0; - height: 18px; - position: relative; - width: 28px; -`; - -export const ToggleInput = styled.input` - height: 0; - opacity: 0; - position: absolute; - width: 0; - - &:checked + span { - background: #4a38f5; - } - - &:checked + span::after { - transform: translateX(12px); - } -`; - -export const ToggleTrack = styled.span` - background: rgba(255, 255, 255, 0.14); - border-radius: 999px; - cursor: pointer; - inset: 0; - position: absolute; - transition: background 0.2s ease; - - &::after { - background: #fff; - border-radius: 50%; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35); - content: ''; - height: 12px; - left: 2px; - position: absolute; - top: 3px; - transition: transform 0.2s ease; - width: 12px; - } -`; - -type ToggleControlProps = { - checked: boolean; - label: ReactNode; - onChange: ChangeEventHandler; -}; - -export function ToggleControl({ - checked, - label, - onChange, -}: ToggleControlProps) { - return ( - - {label} - - - - - - ); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/controls-form-constants.ts b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/controls-form-constants.ts deleted file mode 100644 index f0c3e62512..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/controls-form-constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const TAB_LABEL_WIDTH = 72; diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/controls-ui.ts b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/controls-ui.ts deleted file mode 100644 index a179441244..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/controls-ui.ts +++ /dev/null @@ -1,56 +0,0 @@ -export { TAB_LABEL_WIDTH } from './controls-form-constants'; - -export { - ColorControlLabel, - ColorControlRow, - ColorField, - ColorHexInput, - ColorInput, - ColorPickerField, - ColorSwatch, - ColorSwatchButton, -} from './ColorField'; - -export { LabelWithTooltip } from './LabelWithTooltip'; - -export { - ControlGrid, - ExportButton, - ExportNameInput, - ExportNote, - ExportPreview, - PanelShell, - ShapeRow, - SmallBody, - UploadButton, - ValueDisplay, -} from './ControlsPanelShell'; - -export { SegmentedControl, SegmentedLabel } from './SegmentedControl'; - -export { SelectControl, SelectInput, SelectLabel } from './SelectControl'; - -export { - ControlValue, - SliderControl, - SliderInput, - SliderLabel, -} from './SliderControl'; - -export { TabButton, TabContent, TabsBar } from './ControlsTabs'; - -export { - Toggle, - ToggleControl, - ToggleInput, - ToggleRow, - ToggleText, - ToggleTrack, -} from './ToggleControl'; - -export { - Section, - SectionHeader, - SectionTitle, - SectionToggleHeader, -} from './ControlsSections'; diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/effect-components/TooltipPositionEffect.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/controls/effect-components/TooltipPositionEffect.tsx deleted file mode 100644 index 0fcc05263d..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/controls/effect-components/TooltipPositionEffect.tsx +++ /dev/null @@ -1,47 +0,0 @@ -'use client'; - -import { useEffect, type RefObject } from 'react'; - -type TooltipPositionEffectProps = { - buttonRef: RefObject; - isOpen: boolean; - setTooltipPosition: (position: { left: number; top: number }) => void; -}; - -export function TooltipPositionEffect({ - buttonRef, - isOpen, - setTooltipPosition, -}: TooltipPositionEffectProps) { - useEffect(() => { - if (!isOpen) { - return; - } - - const updateTooltipPosition = () => { - const button = buttonRef.current; - - if (!button) { - return; - } - - const rect = button.getBoundingClientRect(); - setTooltipPosition({ - left: rect.left + rect.width / 2, - top: rect.bottom + 12, - }); - }; - - updateTooltipPosition(); - - window.addEventListener('resize', updateTooltipPosition); - window.addEventListener('scroll', updateTooltipPosition, true); - - return () => { - window.removeEventListener('resize', updateTooltipPosition); - window.removeEventListener('scroll', updateTooltipPosition, true); - }; - }, [isOpen, buttonRef, setTooltipPosition]); - - return null; -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/effect-components/CopyHalftoneShortcutEffect.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/effect-components/CopyHalftoneShortcutEffect.tsx deleted file mode 100644 index 7aa8da8b42..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/effect-components/CopyHalftoneShortcutEffect.tsx +++ /dev/null @@ -1,65 +0,0 @@ -'use client'; - -import { useEffect } from 'react'; - -function isEditablePasteTarget(target: EventTarget | null) { - if (!(target instanceof HTMLElement)) { - return false; - } - - return ( - target.isContentEditable || - target instanceof HTMLInputElement || - target instanceof HTMLTextAreaElement || - target.closest('[contenteditable=""], [contenteditable="true"]') !== null - ); -} - -function hasTextSelection() { - const selection = window.getSelection(); - - return selection !== null && selection.toString().trim().length > 0; -} - -type CopyHalftoneShortcutEffectProps = { - canvasLayerRef: React.RefObject; - onCopy: (width: number, height: number) => void; -}; - -export function CopyHalftoneShortcutEffect({ - canvasLayerRef, - onCopy, -}: CopyHalftoneShortcutEffectProps) { - useEffect(() => { - const handleKeyDown = (event: KeyboardEvent) => { - const isCopyShortcut = - (event.metaKey || event.ctrlKey) && - !event.shiftKey && - !event.altKey && - event.key.toLowerCase() === 'c'; - - if (!isCopyShortcut) { - return; - } - - if (isEditablePasteTarget(event.target) || hasTextSelection()) { - return; - } - - const canvasLayer = canvasLayerRef.current; - const width = Math.max(canvasLayer?.clientWidth ?? 0, 1); - const height = Math.max(canvasLayer?.clientHeight ?? 0, 1); - - event.preventDefault(); - onCopy(width, height); - }; - - window.addEventListener('keydown', handleKeyDown); - - return () => { - window.removeEventListener('keydown', handleKeyDown); - }; - }, [canvasLayerRef, onCopy]); - - return null; -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/effect-components/PasteImageEffect.tsx b/packages/twenty-website/src/app/[locale]/halftone/_components/effect-components/PasteImageEffect.tsx deleted file mode 100644 index b8da6edb85..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/effect-components/PasteImageEffect.tsx +++ /dev/null @@ -1,86 +0,0 @@ -'use client'; - -import { useEffect } from 'react'; - -const CLIPBOARD_IMAGE_EXTENSION_BY_MIME: Record = { - 'image/bmp': '.bmp', - 'image/gif': '.gif', - 'image/jpeg': '.jpg', - 'image/png': '.png', - 'image/svg+xml': '.svg', - 'image/webp': '.webp', -}; - -function isEditablePasteTarget(target: EventTarget | null) { - if (!(target instanceof HTMLElement)) { - return false; - } - - return ( - target.isContentEditable || - target instanceof HTMLInputElement || - target instanceof HTMLTextAreaElement || - target.closest('[contenteditable=""], [contenteditable="true"]') !== null - ); -} - -function createPastedImageFile(file: File) { - const hasExtension = /\.[^.]+$/i.test(file.name); - - if (hasExtension) { - return file; - } - - const extension = - CLIPBOARD_IMAGE_EXTENSION_BY_MIME[file.type] ?? - CLIPBOARD_IMAGE_EXTENSION_BY_MIME['image/png']; - - return new File([file], `pasted-image-${Date.now()}${extension}`, { - type: file.type || 'image/png', - lastModified: Date.now(), - }); -} - -type PasteImageEffectProps = { - onPasteImage: (file: File) => void; - onPasteError: () => void; -}; - -export function PasteImageEffect({ - onPasteImage, - onPasteError, -}: PasteImageEffectProps) { - useEffect(() => { - const handlePaste = (event: ClipboardEvent) => { - if (isEditablePasteTarget(event.target)) { - return; - } - - const imageItem = Array.from(event.clipboardData?.items ?? []).find( - (item) => item.type.startsWith('image/'), - ); - - if (!imageItem) { - return; - } - - const pastedFile = imageItem.getAsFile(); - - if (!pastedFile) { - onPasteError(); - return; - } - - event.preventDefault(); - onPasteImage(createPastedImageFile(pastedFile)); - }; - - window.addEventListener('paste', handlePaste); - - return () => { - window.removeEventListener('paste', handlePaste); - }; - }, [onPasteImage, onPasteError]); - - return null; -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_components/halftone-studio.styles.ts b/packages/twenty-website/src/app/[locale]/halftone/_components/halftone-studio.styles.ts deleted file mode 100644 index cb82c6e90f..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_components/halftone-studio.styles.ts +++ /dev/null @@ -1,124 +0,0 @@ -import { LocalizedLink } from '@/lib/i18n'; -import { theme } from '@/theme'; -import { styled } from '@linaria/react'; - -const DESKTOP_CONTROLS_PANEL_WIDTH = 320; -const DESKTOP_CONTROLS_PANEL_OFFSET = 20; -const DESKTOP_CONTROLS_PANEL_FOOTPRINT = - DESKTOP_CONTROLS_PANEL_WIDTH + DESKTOP_CONTROLS_PANEL_OFFSET; - -export const StudioShell = styled.div<{ $background: string }>` - background: ${(props) => props.$background}; - /* Full-screen tool: track the visible viewport so the bottom controls bar - * is reachable on mobile Safari (where 100vh extends behind the URL bar). */ - height: 100vh; - height: 100dvh; - overflow: hidden; - position: relative; - width: 100%; -`; - -export const ContentRegion = styled.div<{ $panelOpen: boolean }>` - height: 100%; - margin-right: auto; - position: relative; - transition: width 0.18s ease; - width: ${(props) => - props.$panelOpen - ? `calc(100% - ${DESKTOP_CONTROLS_PANEL_FOOTPRINT}px)` - : '100%'}; - - @media (max-width: ${theme.breakpoints.md - 1}px) { - width: 100%; - } -`; - -export const CanvasLayer = styled.div` - height: 100%; - width: 100%; -`; - -export const LogoLink = styled(LocalizedLink)` - display: grid; - left: 24px; - position: absolute; - top: 24px; - z-index: 2; -`; - -export const Hint = styled.div<{ $tone: 'dark' | 'light'; $visible: boolean }>` - color: ${(props) => - props.$tone === 'dark' - ? 'rgba(255, 255, 255, 0.34)' - : 'rgba(0, 0, 0, 0.3)'}; - font-family: ${theme.font.family.mono}; - font-size: 11px; - left: 50%; - opacity: ${(props) => (props.$visible ? 1 : 0)}; - pointer-events: none; - position: absolute; - top: 20px; - transform: translateX(-50%); - transition: opacity 0.3s ease; - z-index: 1; -`; - -export const Status = styled.div<{ - $error: boolean; - $tone: 'dark' | 'light'; - $visible: boolean; -}>` - color: ${(props) => { - if (props.$error) { - return 'rgba(214, 66, 66, 0.92)'; - } - - return props.$tone === 'dark' - ? 'rgba(255, 255, 255, 0.62)' - : 'rgba(0, 0, 0, 0.55)'; - }}; - font-family: ${theme.font.family.mono}; - font-size: 11px; - left: 50%; - opacity: ${(props) => (props.$visible ? 1 : 0)}; - pointer-events: none; - position: absolute; - top: 44px; - transform: translateX(-50%); - transition: opacity 0.2s ease; - z-index: 1; -`; - -export const ControlsPositioner = styled.div` - align-items: flex-start; - bottom: 20px; - display: flex; - height: calc(100vh - 40px); - height: calc(100dvh - 40px); - justify-content: flex-end; - pointer-events: none; - position: fixed; - right: 20px; - top: 20px; - z-index: 3; - - @media (max-width: ${theme.breakpoints.md - 1}px) { - bottom: 16px; - height: 48vh; - left: 16px; - right: 16px; - top: auto; - } -`; - -export const ControlsPanelFrame = styled.div<{ $visible: boolean }>` - height: ${(props) => (props.$visible ? '100%' : 'auto')}; - pointer-events: auto; - @media (max-width: ${theme.breakpoints.md - 1}px) { - width: ${(props) => (props.$visible ? '100%' : 'auto')}; - } -`; - -export const HiddenFileInput = styled.input` - display: none; -`; diff --git a/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-default-halftone-image.ts b/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-default-halftone-image.ts deleted file mode 100644 index ad6f426630..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-default-halftone-image.ts +++ /dev/null @@ -1,23 +0,0 @@ -'use client'; - -import { useEffect } from 'react'; - -type UseDefaultHalftoneImageOptions = { - loadDefaultImageFile: () => Promise; - setImageFile: (updater: (currentFile: File | null) => File | null) => void; -}; - -export function useDefaultHalftoneImage({ - loadDefaultImageFile, - setImageFile, -}: UseDefaultHalftoneImageOptions) { - useEffect(() => { - void loadDefaultImageFile() - .then((file) => { - setImageFile((currentFile) => currentFile ?? file); - }) - .catch((error) => { - console.error(error); - }); - }, [loadDefaultImageFile, setImageFile]); -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-geometry-loader.ts b/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-geometry-loader.ts deleted file mode 100644 index 436e434883..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-geometry-loader.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { - createFallbackGeometry, - disposeGeometryCache, - getGeometryForSpec, -} from '@/lib/halftone/utils/geometry-registry'; -import type { HalftoneGeometrySpec } from '@/lib/halftone/utils/state'; -import { useEffect, useRef, useState } from 'react'; -import type * as THREE from 'three'; - -type GeometryCacheEntry = THREE.BufferGeometry | Promise; - -type GeometryLoaderCallbacks = { - onLoadStart: (label: string) => void; - onLoadSuccess: () => void; - onLoadError: (message: string) => void; - onFallbackShape: (key: string) => void; -}; - -export function useGeometryLoader( - selectedShape: HalftoneGeometrySpec | undefined, - importedFiles: Record, - callbacks: GeometryLoaderCallbacks, -) { - const [activeGeometry, setActiveGeometry] = useState( - () => createFallbackGeometry(), - ); - const geometryCacheReference = useRef>( - new Map([['torusKnot', activeGeometry]]), - ); - const lastSuccessfulShapeReference = useRef( - selectedShape?.key ?? 'torusKnot', - ); - - useEffect(() => { - const geometryCache = geometryCacheReference.current; - - return () => { - disposeGeometryCache(geometryCache); - }; - }, []); - - useEffect(() => { - if (!selectedShape) { - return; - } - - let cancelled = false; - const geometryCache = geometryCacheReference.current; - - // Invalidate cached geometry when an imported file changes so we don't - // serve stale geometry from a previous file under the same key. - if (selectedShape.kind === 'imported') { - geometryCache.delete(selectedShape.key); - callbacks.onLoadStart(selectedShape.label); - } else { - callbacks.onLoadSuccess(); - } - - void getGeometryForSpec( - selectedShape, - importedFiles[selectedShape.key], - geometryCache, - ) - .then((geometry) => { - if (cancelled) { - return; - } - - lastSuccessfulShapeReference.current = selectedShape.key; - setActiveGeometry(geometry); - callbacks.onLoadSuccess(); - }) - .catch((error) => { - if (cancelled) { - return; - } - - console.error(error); - - callbacks.onLoadError( - error instanceof Error - ? error.message - : `${selectedShape.label} failed to load.`, - ); - - if (lastSuccessfulShapeReference.current !== selectedShape.key) { - callbacks.onFallbackShape(lastSuccessfulShapeReference.current); - } - }); - - return () => { - cancelled = true; - }; - }, [selectedShape, importedFiles, callbacks]); - - return activeGeometry; -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-image-element.ts b/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-image-element.ts deleted file mode 100644 index e39efaa1b5..0000000000 --- a/packages/twenty-website/src/app/[locale]/halftone/_hooks/use-image-element.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { useEffect, useState } from 'react'; - -export function useImageElement(imageFile: File | null) { - const [imageElement, setImageElement] = useState( - null, - ); - - useEffect(() => { - if (!imageFile) { - setImageElement(null); - return; - } - - let cancelled = false; - const url = URL.createObjectURL(imageFile); - const img = new Image(); - - img.onload = () => { - if (!cancelled) { - setImageElement(img); - } - }; - - img.onerror = () => { - if (!cancelled) { - setImageElement(null); - } - }; - - img.src = url; - - return () => { - cancelled = true; - img.onload = null; - img.onerror = null; - URL.revokeObjectURL(url); - }; - }, [imageFile]); - - return imageElement; -} diff --git a/packages/twenty-website/src/app/[locale]/halftone/page.tsx b/packages/twenty-website/src/app/[locale]/halftone/page.tsx index aeae69145e..9bce848ca2 100644 --- a/packages/twenty-website/src/app/[locale]/halftone/page.tsx +++ b/packages/twenty-website/src/app/[locale]/halftone/page.tsx @@ -1,8 +1,21 @@ -import { HalftoneStudio } from '@/app/[locale]/halftone/_components/HalftoneStudio'; -import { buildRouteMetadata } from '@/lib/seo'; +import { + getRouteI18n, + type LocaleRouteParams, +} from '@/platform/i18n/get-route-i18n'; +import { buildRouteMetadata } from '@/platform/seo'; +import { HalftoneStudioMount } from '@/platform/visuals/halftone-studio/studio/HalftoneStudioMount'; export const generateMetadata = buildRouteMetadata('halftone'); -export default function HalftonePage() { - return ; +// Internal dev tool: noindex via the route registry record. The studio mounts +// client-only behind a dynamic(ssr:false) boundary, so three never enters any +// initial chunk. +export default async function HalftonePage({ + params, +}: { + params: Promise; +}) { + await getRouteI18n(params); + + return ; } diff --git a/packages/twenty-website/src/app/[locale]/layout.tsx b/packages/twenty-website/src/app/[locale]/layout.tsx index c31bcdc082..dd1bbbea88 100644 --- a/packages/twenty-website/src/app/[locale]/layout.tsx +++ b/packages/twenty-website/src/app/[locale]/layout.tsx @@ -1,30 +1,18 @@ -import { - buildOrganizationJsonLd, - buildSoftwareApplicationJsonLd, - getSiteUrl, - JsonLd, -} from '@/lib/seo'; -import { DRACO_DECODER_ORIGIN } from '@/lib/visual-runtime/utils/draco-decoder-path'; -import { theme } from '@/theme'; -import { cssVariables } from '@/theme/css-variables'; import { css } from '@linaria/core'; -import { styled } from '@linaria/react'; -import type { Metadata } from 'next'; import { Aleo, Azeret_Mono, Host_Grotesk, VT323 } from 'next/font/google'; import { type ReactNode } from 'react'; -import { FooterVisibilityGate } from '@/app/_components/FooterVisibilityGate'; -import { ScrollToTopOnRouteChange } from '@/app/_components/ScrollToTopOnRouteChange'; +import { getLocaleMessages } from '@/platform/i18n/get-locale-messages'; import { - I18nProvider, - localeToUrlSegment, - WEBSITE_LOCALE_LIST, - resolveLocaleParam, -} from '@/lib/i18n'; -import { getLocaleMessages, setServerI18n } from '@/lib/i18n/server'; -import { ContactCalModalRoot } from '@/sections/ContactCal'; -import { Footer } from '@/sections/Footer'; -import { PartnerApplicationModalRoot } from '@/sections/PartnerApplication'; + getRouteI18n, + type LocaleRouteParams, +} from '@/platform/i18n/get-route-i18n'; +import { ContactCalModalRoot } from '@/contact-cal'; +import { I18nProvider } from '@/platform/i18n/I18nProvider'; +import { localeToUrlSegment } from '@/platform/i18n/locale-to-url-segment'; +import { resolveLocaleParam } from '@/platform/i18n/resolve-locale-param'; +import { WEBSITE_LOCALE_LIST } from '@/platform/i18n/website-locale-list'; +import { color, fontFamily, tokenCssVariables } from '@/tokens'; const hostGrotesk = Host_Grotesk({ subsets: ['latin'], @@ -54,7 +42,19 @@ const vt323 = VT323({ display: 'swap', }); -const _globalStyles = css` +const globalStyles = css` + /* One root rule instead of per-component guards: motion collapses to + instant for users who prefer reduced motion. State still applies; + only the travel disappears. */ + @media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + transition-duration: 0.01ms !important; + } + } + :global(*), :global(*::before), :global(*::after) { @@ -63,66 +63,19 @@ const _globalStyles = css` padding: 0; } - :global(html) { - background-color: ${theme.colors.primary.background[100]}; - } - :global(body) { - color: ${theme.colors.primary.text[100]}; - display: flex; - font-family: ${theme.font.family.sans}; - flex-direction: column; + background-color: ${color('white')}; + color: ${color('black')}; + font-family: ${fontFamily('sans')}; min-height: 100vh; min-height: 100dvh; -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; } `; -const StyledMain = styled.main` - display: flex; - flex-direction: column; - flex-grow: 1; -`; - -const SITE_TITLE = 'Twenty | #1 Open Source CRM'; -const SITE_DESCRIPTION = - 'The #1 Open Source CRM for modern teams. Modular, scalable, and built to fit your business.'; - -export const metadata: Metadata = { - metadataBase: new URL(getSiteUrl()), - title: { - default: SITE_TITLE, - template: '%s | Twenty', - }, - description: SITE_DESCRIPTION, - applicationName: 'Twenty', - openGraph: { - title: SITE_TITLE, - description: SITE_DESCRIPTION, - url: '/', - siteName: 'Twenty', - type: 'website', - }, - twitter: { - card: 'summary_large_image', - title: SITE_TITLE, - description: SITE_DESCRIPTION, - site: '@twentycrm', - creator: '@twentycrm', - }, - alternates: { - types: { - 'application/rss+xml': '/articles/feed.xml', - }, - }, -}; - -type LocaleLayoutParams = { locale: string }; - export const dynamicParams = false; -export const generateStaticParams = (): LocaleLayoutParams[] => +export const generateStaticParams = (): LocaleRouteParams[] => WEBSITE_LOCALE_LIST.map((locale) => ({ locale: localeToUrlSegment(locale), })); @@ -132,39 +85,18 @@ const LocaleLayout = async ({ params, }: { children: ReactNode; - params: Promise; + params: Promise; }) => { - const { locale: rawLocale } = await params; - const locale = resolveLocaleParam(rawLocale); - setServerI18n(locale); - const messages = getLocaleMessages(locale); + await getRouteI18n(params); + const locale = resolveLocaleParam((await params).locale); return ( - - - - - - - - - {children} - -