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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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 = (