34e3b1b90b
## Summary Application-side preparation so `twenty-website-new` can take over the canonical `twenty.com` hostname from the legacy `twenty-website` (Vercel) deployment without breaking SEO or existing inbound links. ### What's added - **`src/app/robots.ts`** — serves `/robots.txt` and points crawlers at the new `/sitemap.xml`. Honours `NEXT_PUBLIC_WEBSITE_URL` with a `https://twenty.com` fallback. - **`src/app/sitemap.ts`** — serves `/sitemap.xml` listing the canonical public routes of the new website (home, why-twenty, product, pricing, partners, releases, customers + each case study, privacy-policy, terms). - **`next.config.ts` `redirects()`** — adds: - The existing `docs.twenty.com` permanent redirects from the legacy site (`/user-guide`, `/developers`, `/twenty-ui` and their nested variants). - 308-redirects for renamed/restructured pages so existing inbound links and Google results keep working: | From | To | |-------------------------------------|-----------------------------| | `/story` | `/why-twenty` | | `/legal/privacy` | `/privacy-policy` | | `/legal/terms` | `/terms` | | `/legal/dpa` | `/terms` | | `/case-studies/9-dots-story` | `/customers/9dots` | | `/case-studies/act-immi-story` | `/customers/act-education` | | `/case-studies/:slug*` | `/customers` | | `/implementation-services` | `/partners` | | `/onboarding-packages` | `/partners` | ### What's intentionally **not** added Routes that exist on the legacy site but have no equivalent on the new website are left as honest 404s for now (we can decide on landing pages later): - `/jobs`, `/jobs/*` - `/contributors`, `/contributors/*` - `/oss-friends` ## Cutover order 1. Merge this PR. 2. Bump the website-new image tag in `twenty-infra-releases` (`prod-eu`) so the new robots / sitemap / redirects are live on `https://website-new.twenty.com`. 3. Smoke test on `https://website-new.twenty.com`: - `curl -sI https://website-new.twenty.com/robots.txt` - `curl -sI https://website-new.twenty.com/sitemap.xml` - `curl -sI https://website-new.twenty.com/story` — expect 308 to `/why-twenty` - `curl -sI https://website-new.twenty.com/legal/privacy` — expect 308 to `/privacy-policy` 4. Merge the companion `twenty-infra` PR ([twentyhq/twenty-infra#589](https://github.com/twentyhq/twenty-infra/pull/589)) so the ingress accepts `Host: twenty.com` and `Host: www.twenty.com`. 5. Flip the Cloudflare DNS records for `twenty.com` and `www` to the EKS NLB and purge the Cloudflare cache.