diff --git a/packages/twenty-website-redone/.env.example b/packages/twenty-website-redone/.env.example new file mode 100644 index 0000000000..61d8adc22a --- /dev/null +++ b/packages/twenty-website-redone/.env.example @@ -0,0 +1,27 @@ +# 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= diff --git a/packages/twenty-website-redone/.gitignore b/packages/twenty-website-redone/.gitignore index 2f66d3a5c2..343df47880 100644 --- a/packages/twenty-website-redone/.gitignore +++ b/packages/twenty-website-redone/.gitignore @@ -7,6 +7,7 @@ yarn-debug.log* yarn-error.log* .env .env* +!.env.example *.tsbuildinfo next-env.d.ts 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 new file mode 100644 index 0000000000..3bca6de211 --- /dev/null +++ b/packages/twenty-website-redone/public/.well-known/microsoft-identity-association.json @@ -0,0 +1,13 @@ +{ + "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 new file mode 100644 index 0000000000..abaf3e2b1f --- /dev/null +++ b/packages/twenty-website-redone/public/.well-known/openai-apps-challenge @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..ed3495bc59 --- /dev/null +++ b/packages/twenty-website-redone/public/.well-known/security.txt @@ -0,0 +1,5 @@ +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 new file mode 100644 index 0000000000..bad18fab32 --- /dev/null +++ b/packages/twenty-website-redone/public/images/core/logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/packages/twenty-website-redone/public/images/readme/book-icon.svg b/packages/twenty-website-redone/public/images/readme/book-icon.svg new file mode 100644 index 0000000000..a21bb9485e --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/book-icon.svg @@ -0,0 +1,7 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/code-icon.svg b/packages/twenty-website-redone/public/images/readme/code-icon.svg new file mode 100644 index 0000000000..d4c56e01bf --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/code-icon.svg @@ -0,0 +1,5 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/crowdin.webp b/packages/twenty-website-redone/public/images/readme/crowdin.webp new file mode 100644 index 0000000000..2255648c48 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/crowdin.webp 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 new file mode 100644 index 0000000000..71b9fdac9e --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/discord-icon.svg @@ -0,0 +1 @@ + \ 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 new file mode 100644 index 0000000000..366acfc1ed Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/figma-icon.webp 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 new file mode 100644 index 0000000000..5fd77e5e42 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/github-cover-dark.webp 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 new file mode 100644 index 0000000000..a8a51b1af0 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/github-cover-light.webp 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 new file mode 100644 index 0000000000..13fbd24d57 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/globe-icon.svg @@ -0,0 +1,7 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/greptile.webp b/packages/twenty-website-redone/public/images/readme/greptile.webp new file mode 100644 index 0000000000..ab269df423 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/greptile.webp 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 new file mode 100644 index 0000000000..e91550ecb7 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/language-icon.svg @@ -0,0 +1,7 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/linkedin-icon.svg b/packages/twenty-website-redone/public/images/readme/linkedin-icon.svg new file mode 100644 index 0000000000..5f09a9ec9b --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/linkedin-icon.svg @@ -0,0 +1,7 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/map-icon.svg b/packages/twenty-website-redone/public/images/readme/map-icon.svg new file mode 100644 index 0000000000..ec4b078e65 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/map-icon.svg @@ -0,0 +1,5 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/message-icon.svg b/packages/twenty-website-redone/public/images/readme/message-icon.svg new file mode 100644 index 0000000000..000a2a5745 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/message-icon.svg @@ -0,0 +1,6 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/monitor-icon.svg b/packages/twenty-website-redone/public/images/readme/monitor-icon.svg new file mode 100644 index 0000000000..c00d29c739 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/monitor-icon.svg @@ -0,0 +1,6 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/planner-icon.svg b/packages/twenty-website-redone/public/images/readme/planner-icon.svg new file mode 100644 index 0000000000..c6a1ad2ef6 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/planner-icon.svg @@ -0,0 +1,5 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/rocket-icon.svg b/packages/twenty-website-redone/public/images/readme/rocket-icon.svg new file mode 100644 index 0000000000..ed2801e7ab --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/rocket-icon.svg @@ -0,0 +1,5 @@ + diff --git a/packages/twenty-website-redone/public/images/readme/sentry.webp b/packages/twenty-website-redone/public/images/readme/sentry.webp new file mode 100644 index 0000000000..d8679cc1b4 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/sentry.webp 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 new file mode 100644 index 0000000000..0eccf9f125 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/stack-nestjs.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..03480bd647 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/stack-nx.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..ef8a84efea --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/stack-postgresql.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..48b0c7c360 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/stack-react.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..bd0adb694b --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/stack-redis.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..3610a90551 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/stack-typescript.svg @@ -0,0 +1 @@ +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 new file mode 100644 index 0000000000..ce8149fa17 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/star-icon.svg @@ -0,0 +1,3 @@ + 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 new file mode 100644 index 0000000000..d17740e6a4 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-ai-agents-dark.webp 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 new file mode 100644 index 0000000000..ff7767181d Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-ai-agents-light.webp 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 new file mode 100644 index 0000000000..ca7589db68 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-all-tools-dark.webp 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 new file mode 100644 index 0000000000..679090dad1 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-all-tools-light.webp 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 new file mode 100644 index 0000000000..9f93b1e62c Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-build-apps-dark.webp 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 new file mode 100644 index 0000000000..8e2c962847 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-build-apps-light.webp 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 new file mode 100644 index 0000000000..627ed655bc Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-crm-tools-dark.webp 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 new file mode 100644 index 0000000000..dd54c06813 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-crm-tools-light.webp 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 new file mode 100644 index 0000000000..4851348b52 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-tools-dark.webp 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 new file mode 100644 index 0000000000..bf3b882788 Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-tools-light.webp 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 new file mode 100644 index 0000000000..a99d790c6b Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-version-control-dark.webp 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 new file mode 100644 index 0000000000..324f025d6a Binary files /dev/null and b/packages/twenty-website-redone/public/images/readme/v2-version-control-light.webp 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 new file mode 100644 index 0000000000..47d6b9f178 --- /dev/null +++ b/packages/twenty-website-redone/public/images/readme/x-icon.svg @@ -0,0 +1,4 @@ + diff --git a/packages/twenty-website-redone/scripts/check-conventions.mjs b/packages/twenty-website-redone/scripts/check-conventions.mjs index d4cb9de2f1..e55a8335d7 100644 --- a/packages/twenty-website-redone/scripts/check-conventions.mjs +++ b/packages/twenty-website-redone/scripts/check-conventions.mjs @@ -82,6 +82,15 @@ const PUBLIC_SVG_BRAND_FILES = new Set([ // and fed through the halftone shader, not rendered as an icon glyph. 'public/images/shared/halftone/twenty-logo.svg', ]); +// Root README documentation assets: the repo's top-level README.md embeds +// these SVGs by URL. They are not site UI (so not src/icons components) nor +// third-party brand marks — they live here only so the README's relative +// paths keep resolving once this package takes over the twenty-website +// public/ path. A trailing slash matches a whole directory. +const PUBLIC_SVG_README_DOC_PATHS = [ + 'public/images/core/logo.svg', + 'public/images/readme/', +]; // Vertical rhythm rides margins ('& > * + *'), not row-gap: gap breaks // silently when a wrapper changes the child list. row-gap is allowed only // where layout is genuinely multi-axis (wrapping rows, multi-column @@ -391,7 +400,10 @@ const walkPublic = (dir) => { }; walkPublic('public'); for (const svgPath of publicSvgs) { - if (!PUBLIC_SVG_BRAND_FILES.has(svgPath)) { + const isReadmeDocAsset = PUBLIC_SVG_README_DOC_PATHS.some((allowed) => + allowed.endsWith('/') ? svgPath.startsWith(allowed) : svgPath === allowed, + ); + if (!PUBLIC_SVG_BRAND_FILES.has(svgPath) && !isReadmeDocAsset) { failures.push( `${svgPath}: owned vector glyphs are components in src/icons — public/ svg files are third-party brand assets only (or add to PUBLIC_SVG_BRAND_FILES with a reason).`, ); diff --git a/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.test.ts b/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.test.ts index 710f7407f3..1268e103a9 100644 --- a/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.test.ts +++ b/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.test.ts @@ -68,4 +68,13 @@ describe('locale rewrites', () => { expect(resolve('/sitemap.xml')).toBe('/sitemap.xml'); expect(resolve('/og-image.png')).toBe('/og-image.png'); }); + + it('should leave the .well-known directory untouched, including extensionless files', () => { + expect(resolve('/.well-known/security.txt')).toBe( + '/.well-known/security.txt', + ); + expect(resolve('/.well-known/openai-apps-challenge')).toBe( + '/.well-known/openai-apps-challenge', + ); + }); }); diff --git a/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.ts b/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.ts index cd43ee11f7..f803be0fe4 100644 --- a/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.ts +++ b/packages/twenty-website-redone/src/platform/routing/locale-rewrite-patterns.ts @@ -13,6 +13,7 @@ const RESERVED_PREFIXES = [ 'fonts', 'lottie', 'models', + '.well-known', ]; export const buildLocaleRewrites = (