3281d37bdf80098c411a4101736bfd7c5e568d8d
9 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
2e5ccd9b86 | [Website] Codebase cleanup and SEO improvements. (#20415) | ||
|
|
284ebeb12d |
[Website] Reintroduce the product page. (#20349)
This PR re-introduces the Product page that we decided to hold back in the first release. Subsequent PRs will work on polishing the Product page to have interactive visuals, but merging the static version to record a snapshot. No production deployments are planned until product page is polished and blog has the required content - we'd push to prod next week with these two checkpoints. |
||
|
|
a90895e167 |
[Website] locale-segment routing and shared Lingui factory (#20079)
**1. Shared Lingui factory in `twenty-shared`**
- Extracted `createI18nInstanceFactory` into
`packages/twenty-shared/src/i18n/create-i18n-instance-factory.ts` so
every package gets the same per-render Lingui bootstrap with a
per-locale singleton cache and a `SOURCE_LOCALE` fallback.
- `twenty-emails/src/utils/i18n.utils.ts` now consumes the shared
factory.
**2. `twenty-website-new` Lingui bootstrap + Crowdin wiring**
- `lingui.config.ts`, `src/lib/i18n/*`, `nx run
twenty-website-new:lingui:{extract,compile}`.
- 31 locale PO files generated; minified compiled output kept out of
Prettier and Oxlint.
- `i18n-{push,pull}.yaml` workflows updated to include
`twenty-website-new` in Crowdin sync.
**3. `app/[locale]/...` segment routing with English at the root**
- All marketing routes moved under `src/app/[locale]/`; static
generation preserved (15 routes × 31 locales = 465 prerendered URLs).
- Middleware behavior:
- `/{en}/...` → 301 redirect to unprefixed canonical.
- `/{non-en}/...` → pass through, set `NEXT_LOCALE` cookie.
### What this PR explicitly does not do (deferred)
- Lingui-wrapping the actual marketing copy. Keys, build pipeline, and
runtime are wired; copy migration is a separate, reviewer-friendlier
PR.
|
||
|
|
47710908a8 |
[Website] Architecture, hardening, and perf pass. (#20020)
This PR is the result of a critical architectural review of
`twenty-website-new` and the
follow-on cleanup work. It does not touch any other package. Scope is
everything except
the enterprise/billing routes (deferred to a separate PR) and CI wiring
(also deferred).
### Why
The package had grown organically: ad-hoc scroll/motion/halftone code
per section,
WebGL renderers instantiated raw, sections without a shared shape
contract, route-scoped
files leaking across layers, public API routes without rate limiting /
timeouts /
schema validation, unbounded module-level caches in visual code,
drag/resize handlers
re-rendering React 60x/sec, no security headers, and a Lottie
scroll-mapping that would
silently drift if the asset got re-exported. We needed contracts and
primitives in
place before further work (i18n, decomposition of the giant visual
files, MDX migration
of customer/legal pages) is safe to do.
### What changed
**Layering and contracts (now enforced, not just documented).**
- New layering rule: `app → sections → lib → design-system / theme /
icons`.
Cross-section reuse goes through `lib/`. Flipped the design-system
import rule
from warn to error.
- Extracted shared primitives into `lib/`: `scroll`, `motion`,
`halftone`, `customers`,
`partner-application`, `api`, `seo`, `semver`, `community`,
`visual-runtime`.
- Lifted route-scoped data/types out of `app/` into `lib/` +
`sections/`.
- Section shape contract: every section exposes a single compound export
from
`components/index.ts(x)`; non-leaf sections own the outer `<section>`
from
`Root.tsx`; named slots are matched by `displayName` (no
`Children.toArray`
positional indexing). Enforced by `scripts/check-section-shape.mjs`.
- WebGL boundary: `new THREE.WebGLRenderer(...)` is forbidden outside
`src/lib/visual-runtime/`. Everything goes through
`createSiteWebGlRenderer`,
which enforces the site-wide context cap, the
`NEXT_PUBLIC_DISABLE_HEAVY_VISUALS`
kill switch, and GPU/power-preference defaults. Enforced by
`scripts/check-boundaries.mjs` with per-line
`boundary-allow-next-line:<rule-id>`
escape hatches and stale-directive detection.
**Design system grew to cover real cases.**
- Added Modal, Form, and Layout primitives (Stack / Inline / Grid) so
sections stop
reinventing them. Built on `@base-ui/react` for accessibility + focus
management.
**Public API hardening (non-enterprise).**
- New `lib/api/` primitives: `createRateLimiter` (in-memory token
bucket),
`fetchWithTimeout`, `readJsonBody` (Zod-validated). Applied to
newsletter,
community, and partner-application routes. `/api/partner-application`
specifically
got a per-IP rate limit, body cap, and timeout.
**Performance.**
- `DraggableTerminal` and `DraggableAppWindow`: `pointermove` now
mutates `transform`
(via `translate3d`) and `width`/`height` directly on the DOM ref. React
state
commits only on `pointerup`. Eliminates per-frame re-renders during
interaction.
- `createBoundedFailureCache` (FIFO, 256 entries) replaces unbounded
module-level
failure caches in four visual components. Bounds memory growth from bad
asset URLs.
**Lottie frame-map guard.**
- `dotlottie-react`'s `player.totalFrames` returns a raw float (`op -
ip`), not an
integer. The HomeStepper scroll → frame map is keyed to the authored
timeline,
so silent drift would desync every step boundary.
- Reads now `Math.floor(player.totalFrames)` consistently.
- `scripts/check-lottie-frames.mjs` extracts `op - ip` from
`public/lottie/stepper/stepper.lottie` at build time and asserts it
against
`HOME_STEPPER_LOTTIE_EXPECTED_TOTAL_FRAMES`. If anyone re-exports the
Lottie,
the build fails until both that constant and every `STEP_*_END` are
updated together.
**Security headers (`next.config.ts`).**
- HSTS, `X-Content-Type-Options: nosniff`, `Referrer-Policy:
strict-origin-when-cross-origin`,
`Permissions-Policy` (camera/mic/geolocation/payment off),
`X-Frame-Options: DENY`,
`Content-Security-Policy: frame-ancestors 'none'`.
- Full CSP intentionally deferred until we enumerate all third-party
origins
(Cal.com, Stripe, GitHub avatars, twenty-icons.com, etc.).
**Build / config quirks documented in code.**
- `tsconfig.json` is standalone (does NOT extend the monorepo base) —
Next.js +
React Compiler require options that conflict with the base config.
- `sharp` moved from `devDependencies` to `dependencies` so production
image
optimization works.
### What's deliberately NOT in this PR
- **Enterprise / billing routes** — open redirect on
`/api/enterprise/checkout`,
indefinite-bearer JWT, non-idempotent Stripe seat updates, unpinned
Stripe
`apiVersion`, missing webhook reconciliation, inconsistent error
envelope.
Going out as a separate, security-focused PR.
- **CI workflow for `twenty-website-new`** (`lint` / `typecheck` /
`test` / `build`
targets) — separate follow-up PR.
- **i18n via Lingui** — decision made (we need internationalization and
we already
use Lingui in `twenty-front` / `twenty-emails`); 4-phase migration plan
exists
but does not land here.
- **Decomposition of giant visual files** (HomeVisual, ThreeCards
visuals) — blocked
on the i18n landing first; otherwise we'd rebase the world twice.
- **Customer / legal pages → MDX** — same reason.
- **Selective memoization pass** — needs browser profiling, not blind
`useMemo`.
- **Pre-existing lint errors / typecheck noise** (~44 errors, ~41
warnings, plus
generated Next.js types and `@ts-nocheck` files) are unchanged. The
cleanup
did not introduce new ones.
### Test plan
- [ ] `yarn install`
- [ ] `yarn nx run twenty-website-new:dev` — homepage, customers,
partner,
enterprise activate, blog, why-twenty, plans/pricing, legal pages
render.
- [ ] HomeStepper: scroll through, confirm the Lottie animation lines up
with
every step boundary. Console must NOT log a `totalFrames` mismatch.
- [ ] HomeVisual: drag and resize the terminal + app window; verify
smoothness
(no per-frame React re-renders) and that final position/size persists on
release.
- [ ] Public API endpoints: hit `/api/newsletter`, `/api/community`,
`/api/partner-application` with bad payloads → expect 4xx with Zod
errors,
not 500s. Hammer `/api/partner-application` past the per-IP limit → 429.
- [ ] Response headers on any page include HSTS, nosniff, referrer
policy,
permissions policy, X-Frame-Options, and `frame-ancestors 'none'` CSP.
- [ ] `yarn nx run twenty-website-new:lint` — error/warning count must
not exceed
the pre-existing baseline.
- [ ] `yarn nx run twenty-website-new:typecheck` — same baseline rule.
- [ ] `node packages/twenty-website-new/scripts/check-boundaries.mjs` —
passes,
no stale directives.
- [ ] `node packages/twenty-website-new/scripts/check-section-shape.mjs`
— passes.
- [ ] `node packages/twenty-website-new/scripts/check-lottie-frames.mjs`
— passes.
- [ ] `yarn nx run twenty-website-new:build` — green, including the
three checks
above if wired into the build target.
|
||
|
|
a2099d22b5 |
Optimize website images (#19933)
AVIF has broad support in 2026 we should leverage it for smaller image size <img width="1496" height="847" alt="Screenshot 2026-04-21 at 5 49 58 PM" src="https://github.com/user-attachments/assets/8366a2c7-f72b-4cff-891e-78a372d9a84b" /> ``` /halftone/materials/glass/environment.jpg 41KB 31KB 23% /illustrations/generated/handshake.png 61KB 49KB 19% /illustrations/generated/home-background-bridge.png 19KB 13KB 27% /illustrations/generated/mic.png 47KB 32KB 32% /illustrations/generated/milestone.jpg 101KB 89KB 12% /illustrations/generated/partner-meeting.webp 78KB 37KB 52% /images/case-studies/header-pattern.png 250KB 165KB 33% /images/home/hero/background.webp 101KB 73KB 26% /images/home/hero/foreground.webp 60KB 37KB 38% /images/home/hero/sales-dashboard/distribution.webp 11KB 7KB 29% /images/home/hero/sales-dashboard/revenue.webp 15KB 9KB 37% /images/home/hero/sales-dashboard/visits.webp 14KB 11KB 21% /images/home/hero/twenty-demo-logo.webp 0KB 0KB -99% /images/home/logo-bar/bayer.webp 52KB 37KB 29% /images/home/logo-bar/french-republic.webp 6KB 6KB 5% /images/home/logo-bar/nic.webp 4KB 4KB -3% /images/home/logo-bar/pwc.webp 3KB 2KB 10% /images/home/logo-bar/shiawase-home.webp 7KB 8KB -2% /images/home/logo-bar/windmill-logo.png 2KB 3KB -17% /images/home/logo-bar/windmill-original.webp 2KB 2KB 8% /images/home/problem/monolith-problem.webp 23KB 19KB 13% /images/home/stepper/background-shape.webp 1KB 0KB 34% /images/home/stepper/background.webp 78KB 36KB 53% /images/home/stepper/download-worker.webp 21KB 19KB 6% /images/home/stepper/gears.jpg 24KB 22KB 6% /images/home/three-cards-feature/familiar-interface-gradient.webp 7KB 8KB -11% /images/home/three-cards-feature/familiar-interface.webp 62KB 45KB 27% /images/home/three-cards-feature/fast-path-background-noise.webp 49KB 16KB 66% /images/home/three-cards-feature/fast-path-gradient.webp 7KB 8KB -7% /images/home/three-cards-feature/fast-path.webp 52KB 41KB 21% /images/home/three-cards-feature/live-data-gradient.webp 3KB 2KB 35% /images/home/three-cards-feature/live-data.webp 46KB 36KB 20% /images/partner/hero/hero.webp 123KB 97KB 20% /images/partner/hero/partners-hero.webp 42KB 32KB 23% /images/partner/testimonials/amrendra-singh.webp 6KB 5KB 7% /images/partner/testimonials/benjamin-reynolds.webp 111KB 80KB 27% /images/partner/testimonials/bertrams.jpeg 12KB 10KB 9% /images/partner/testimonials/joseph-chiang.jpg 13KB 11KB 13% /images/partner/testimonials/mike-babiy.png 24KB 19KB 20% /images/partner/testimonials/olivier-reinaud.jpg 11KB 9KB 20% /images/pricing/engagement-band/overlay.webp 72KB 56KB 22% /images/pricing/plans/organization-icon.png 4KB 3KB 10% /images/pricing/plans/pro-icon.png 2KB 3KB -7% /images/pricing/salesforce/help-icon.webp 0KB 0KB -45% /images/product/demo/background.webp 84KB 70KB 16% /images/product/demo/kanban.webp 63KB 57KB 9% /images/product/feature/contacts.webp 44KB 32KB 28% /images/product/feature/dashboards.webp 24KB 21KB 14% /images/product/feature/data.webp 23KB 20KB 13% /images/product/feature/emails.webp 21KB 18KB 12% /images/product/feature/files.webp 14KB 12KB 14% /images/product/feature/mask.webp 148KB 82KB 44% /images/product/feature/pipeline.webp 30KB 26KB 11% /images/product/feature/tasks.webp 37KB 33KB 9% /images/product/stepper/background-shape.webp 1KB 1KB 25% /images/product/stepper/background.webp 61KB 52KB 13% /images/product/stepper/step-one.webp 7KB 7KB 0% /images/product/stepper/step-three.webp 17KB 14KB 13% /images/product/stepper/step-two.webp 7KB 7KB 3% /images/product/tabs/background-shape.webp 7KB 1KB 83% /images/product/tabs/background.webp 180KB 171KB 5% /images/product/tabs/deals.webp 93KB 89KB 4% /images/product/tabs/history.webp 66KB 59KB 10% /images/product/tabs/tasks.webp 90KB 85KB 5% /images/product/tabs/workflow.webp 60KB 55KB 7% /images/releases/0.10/0.10-currency.webp 40KB 28KB 29% /images/releases/0.10/0.10-datetime.webp 34KB 18KB 45% /images/releases/0.10/0.10-json.webp 35KB 25KB 26% /images/releases/0.10/0.10-multi-select.webp 46KB 36KB 22% /images/releases/0.10/0.10-remote.webp 45KB 27KB 39% /images/releases/0.11/0.11-calendar.webp 69KB 56KB 18% /images/releases/0.11/0.11-speed.webp 30KB 21KB 29% /images/releases/0.12/0.12-database-diagram.webp 35KB 25KB 29% /images/releases/0.12/0.12-link-field.webp 50KB 35KB 30% /images/releases/0.12/0.12-loader.webp 57KB 35KB 38% /images/releases/0.12/0.12-notifications.webp 78KB 64KB 17% /images/releases/0.2.3_relations.webp 55KB 39KB 28% /images/releases/0.2.3_webhooks.webp 30KB 25KB 16% /images/releases/0.20/0.20-blocklist.webp 35KB 27KB 22% /images/releases/0.20/0.20-onboarding.webp 68KB 53KB 21% /images/releases/0.20/0.20-timeline.webp 81KB 55KB 32% /images/releases/0.21/0.21-advanced-email-settings.webp 42KB 30KB 27% /images/releases/0.21/0.21-many-many.webp 60KB 46KB 22% /images/releases/0.22/0.22-kanban-improvements.webp 50KB 34KB 31% /images/releases/0.22/0.22-mass-deletion.webp 32KB 20KB 37% /images/releases/0.22/0.22-navbar.webp 35KB 23KB 34% /images/releases/0.23/0.23-created-by.webp 78KB 60KB 23% /images/releases/0.23/0.23-filter-webhooks.webp 54KB 39KB 28% /images/releases/0.23/0.23-notes-tasks.webp 83KB 62KB 25% /images/releases/0.24/0.24-soft-delete.webp 70KB 47KB 31% /images/releases/0.3.0_rating.webp 50KB 46KB 8% /images/releases/0.3.1_contributors.webp 40KB 32KB 20% /images/releases/0.3.2_new_layout.webp 52KB 37KB 28% /images/releases/0.3.3_emails.webp 48KB 38KB 21% /images/releases/0.3.3_kanban.webp 44KB 35KB 19% /images/releases/0.3.3_sign_up.webp 24KB 17KB 25% /images/releases/0.30/0.30-array-field.webp 90KB 68KB 24% /images/releases/0.30/0.30-emails.webp 44KB 30KB 31% /images/releases/0.30/0.30-new-settings.webp 31KB 19KB 37% /images/releases/0.31/0.31-advanced-settings.webp 44KB 30KB 31% /images/releases/0.31/0.31-search.webp 18KB 12KB 31% /images/releases/0.32/0.32-improved-cmdk.webp 50KB 33KB 33% /images/releases/0.32/0.32-webhooks.webp 41KB 30KB 26% /images/releases/0.33/0.33-multiselect-filter.webp 53KB 36KB 31% /images/releases/0.33/0.33-percentage-number.webp 33KB 20KB 38% /images/releases/0.34/0.34-subdomains.webp 57KB 41KB 28% /images/releases/0.35/0.35-Favorites.webp 61KB 41KB 32% /images/releases/0.4/0.4-address-field-type.webp 23KB 15KB 32% /images/releases/0.4/0.4-expand-relation-card.webp 28KB 18KB 34% /images/releases/0.4/0.4-multi-workspace.webp 48KB 35KB 25% /images/releases/0.40/0.40-aggregates.webp 72KB 57KB 21% /images/releases/0.40/0.40-group-by.webp 47KB 32KB 31% /images/releases/0.41/0.41-labs.webp 55KB 40KB 27% /images/releases/0.42/0.42-document-viewer.webp 86KB 72KB 15% /images/releases/0.42/0.42-microsoft.webp 79KB 64KB 18% /images/releases/0.42/0.42-translation.webp 66KB 53KB 19% /images/releases/0.43.0/email-privacy.webp 47KB 33KB 27% /images/releases/0.43.0/search-upgrade.webp 44KB 30KB 31% /images/releases/0.44/0.44-admin-panel.webp 57KB 42KB 25% /images/releases/0.44/0.44-side-panel.webp 67KB 54KB 20% /images/releases/0.50/0.50-advanced-filters.webp 55KB 36KB 33% /images/releases/0.50/0.50-permissions.webp 51KB 37KB 25% /images/releases/0.51.0/0.51-options-menu.webp 59KB 40KB 31% /images/releases/0.52.0/0.52-custom-date-format.webp 37KB 23KB 36% /images/releases/0.52.0/0.52-filtered-views-records.webp 46KB 31KB 31% /images/releases/1.00/1.00-import-update.webp 63KB 39KB 37% /images/releases/1.00/1.00-performance-improvement.webp 52KB 35KB 31% /images/releases/1.00/1.00-permissions.webp 72KB 52KB 28% /images/releases/1.00/1.00-subfield-filtering.webp 73KB 49KB 33% /images/releases/1.00/1.00-workflow.webp 52KB 36KB 29% /images/releases/1.1/1.1-multi-manual-trigger.webp 51KB 37KB 26% /images/releases/1.10/1.10.0-calendar.webp 54KB 38KB 28% /images/releases/1.10/1.10.0-dashboards.webp 33KB 20KB 37% /images/releases/1.11/1.11.0-morph-relations.webp 53KB 40KB 24% /images/releases/1.11/1.11.0-unlisted-views.webp 50KB 34KB 32% /images/releases/1.12/1.12.0-folder-sync.webp 38KB 25KB 32% /images/releases/1.12/1.12.0-side-panel.webp 45KB 34KB 22% /images/releases/1.13/1.13.0-stop-workflow-button.png 39KB 26KB 34% /images/releases/1.14/1.14.0-resize-navbar-and-side-panel.png 58KB 40KB 30% /images/releases/1.15/1.15.0-updated-by-official.webp 36KB 23KB 35% /images/releases/1.15/1.15.0-updated-by.png 36KB 27KB 24% /images/releases/1.15/1.15.0-updated-by.webp 36KB 23KB 35% /images/releases/1.16/1.16.0-files-in-records.webp 43KB 29KB 32% /images/releases/1.16/1.16.0-flexible-relations.webp 42KB 30KB 28% /images/releases/1.17/1.17.0-ai-chat.webp 83KB 67KB 18% /images/releases/1.18/1.18.0-live-updates.webp 56KB 37KB 33% /images/releases/1.18/1.18.0-sidebar-items.webp 36KB 27KB 26% /images/releases/1.19/1.19.0-invite-roles.webp 40KB 26KB 34% /images/releases/1.2/1.2-any-fields.webp 47KB 30KB 35% /images/releases/1.2/1.2-import-relations.webp 42KB 31KB 26% /images/releases/1.20/1.20.0-easier-field-editing.webp 37KB 26KB 27% /images/releases/1.20/1.20.0-field-widgets.webp 38KB 29KB 24% /images/releases/1.21/1.21.0-email-replies.webp 50KB 38KB 25% /images/releases/1.21/1.21.0-maintenance-mode.webp 55KB 39KB 28% /images/releases/1.22/1.22.0-rich-text-layouts.webp 54KB 41KB 24% /images/releases/1.23/1.23.0-easier-layouts.webp 46KB 30KB 34% /images/releases/1.3/1.3-IMAP.webp 83KB 59KB 29% /images/releases/1.3/1.3-merge.webp 64KB 44KB 30% /images/releases/1.4/1.4-field-permissions.webp 50KB 37KB 24% /images/releases/1.4/1.4-two-factor-auth.webp 67KB 50KB 25% /images/releases/1.4/1.4-workflow-filters.webp 38KB 26KB 31% /images/releases/1.5/1.5-workflow-branches.webp 31KB 21KB 31% /images/releases/1.6/1.6-workflows-improvements.webp 45KB 31KB 29% /images/releases/1.7/1.7-impersonating.webp 79KB 60KB 23% /images/releases/1.7/1.7-upsert.webp 51KB 31KB 38% /images/releases/1.8/1.8-bulk-select.webp 49KB 34KB 29% /images/releases/1.8/1.8-search-limit.webp 34KB 23KB 31% /images/releases/1.8/1.8-workflow-iterator.webp 38KB 23KB 39% /images/releases/labs/translation.webp 65KB 46KB 28% /images/shared/companies/logos/a16z.png 0KB 0KB -48% /images/shared/companies/logos/accel.png 0KB 0KB -129% /images/shared/companies/logos/airbnb.png 0KB 0KB -52% /images/shared/companies/logos/airtable.png 0KB 1KB -42% /images/shared/companies/logos/anthropic.png 0KB 0KB -45% /images/shared/companies/logos/apple-1977.png 0KB 1KB -54% /images/shared/companies/logos/apple.png 0KB 0KB -89% /images/shared/companies/logos/calendar.png 0KB 0KB -48% /images/shared/companies/logos/claude.png 40KB 31KB 21% /images/shared/companies/logos/cursor.png 0KB 0KB -58% /images/shared/companies/logos/docusign.png 0KB 0KB -48% /images/shared/companies/logos/figma.png 0KB 0KB -46% /images/shared/companies/logos/founders-fund.png 0KB 0KB -61% /images/shared/companies/logos/github.png 0KB 0KB -37% /images/shared/companies/logos/gmail.png 0KB 1KB -60% /images/shared/companies/logos/google.png 0KB 1KB -36% /images/shared/companies/logos/hubspot.png 0KB 0KB -2% /images/shared/companies/logos/kleiner-perkins.png 0KB 0KB -105% /images/shared/companies/logos/lemlist.png 0KB 0KB -64% /images/shared/companies/logos/linkedin.png 0KB 0KB -66% /images/shared/companies/logos/mailchimp.png 0KB 0KB -39% /images/shared/companies/logos/meet.png 0KB 0KB -51% /images/shared/companies/logos/metabase.png 1KB 1KB -32% /images/shared/companies/logos/microsoft.png 0KB 0KB 4% /images/shared/companies/logos/notion.png 0KB 1KB -19% /images/shared/companies/logos/okta.png 0KB 0KB -35% /images/shared/companies/logos/openai.png 0KB 1KB -13% /images/shared/companies/logos/outlook.png 0KB 0KB -26% /images/shared/companies/logos/outreach.png 0KB 0KB -53% /images/shared/companies/logos/postgresql.png 1KB 1KB -2% /images/shared/companies/logos/qonto.png 0KB 0KB -61% /images/shared/companies/logos/salesforce.png 0KB 0KB -39% /images/shared/companies/logos/segment.png 0KB 1KB -49% /images/shared/companies/logos/sequoia.png 0KB 0KB -59% /images/shared/companies/logos/slack.png 0KB 0KB -40% /images/shared/companies/logos/stripe.png 0KB 0KB -51% /images/shared/companies/logos/tally.png 0KB 0KB -53% /images/shared/companies/logos/twenty.png 0KB 0KB -56% /images/shared/companies/logos/whatsapp.png 0KB 0KB -64% /images/shared/companies/logos/zapier.png 0KB 0KB -27% /images/shared/engagement-band/halftone-on-gray.png 7KB 17KB -121% /images/shared/engagement-band/halftone-on-white.png 2KB 2KB -2% /images/shared/light-noise.webp 0KB 0KB -225% /images/shared/menu/developers-preview.png 65KB 33KB 49% /images/shared/menu/partners-preview.png 52KB 24KB 53% /images/shared/menu/user-guide-preview.png 58KB 50KB 14% /images/shared/people/avatars/alexandre-prot.jpg 0KB 0KB -32% /images/shared/people/avatars/anonymous-anna.jpg 0KB 0KB -81% /images/shared/people/avatars/anonymous-fabrice.jpg 0KB 0KB -28% /images/shared/people/avatars/anonymous-felix.jpg 0KB 0KB -40% /images/shared/people/avatars/anonymous-indira.jpg 0KB 0KB -44% /images/shared/people/avatars/anonymous-laura.jpg 0KB 0KB -52% /images/shared/people/avatars/anonymous-mike.jpg 0KB 0KB -78% /images/shared/people/avatars/anonymous-thomas.jpg 0KB 0KB -44% /images/shared/people/avatars/ben-chestnut.jpg 0KB 0KB -74% /images/shared/people/avatars/brian-chesky.jpg 0KB 0KB -52% /images/shared/people/avatars/chris-wanstrath.jpg 0KB 0KB -46% /images/shared/people/avatars/craig-federighi.jpg 0KB 0KB -63% /images/shared/people/avatars/dario-amodei.jpg 15KB 14KB 4% /images/shared/people/avatars/dylan-field.jpg 0KB 0KB -62% /images/shared/people/avatars/eddy-cue.jpg 0KB 0KB -54% /images/shared/people/avatars/ivan-zhao.jpg 0KB 0KB -69% /images/shared/people/avatars/jeff-williams.jpg 0KB 0KB -59% /images/shared/people/avatars/joe-gebbia.jpg 0KB 0KB -52% /images/shared/people/avatars/katherine-adams.jpg 0KB 0KB -64% /images/shared/people/avatars/patrick-collison.jpg 0KB 0KB -20% /images/shared/people/avatars/peter-reinhardt.jpg 0KB 0KB -87% /images/shared/people/avatars/peter-thiel.jpg 0KB 0KB -57% /images/shared/people/avatars/phil-schiller.jpg 0KB 0KB -52% /images/shared/people/avatars/ping-li.jpg 13KB 12KB 10% /images/shared/people/avatars/ray-damm.jpg 0KB 0KB -41% /images/shared/people/avatars/reid-hoffman.jpg 0KB 0KB -60% /images/shared/people/avatars/roelof-botha.jpg 0KB 0KB -41% /images/shared/people/avatars/ryan-roslansky.jpg 0KB 0KB -46% /images/shared/people/avatars/steve-anavi.jpg 0KB 0KB -32% /images/shared/people/avatars/stewart-butterfield.jpg 0KB 0KB -36% /images/shared/people/avatars/sundar-pichai.jpg 0KB 0KB -41% /images/shared/people/avatars/thomas-dohmke.jpg 15KB 14KB 4% /images/shared/people/avatars/tim-cook.jpg 0KB 0KB -68% /images/why-twenty/hero/background.webp 10KB 9KB 11% === TOTALS === Files: 249 Total WebP: 8.2 MB Total AVIF: 6.1 MB Total saved: 2.1 MB (26%) ``` |
||
|
|
34e3b1b90b |
feat(website-new): add robots.txt, sitemap.xml and legacy redirects (#19911)
## 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. |
||
|
|
0729ad27b7 |
Partners, customers and more (#19862)
## Summary - Refresh the Twenty website with updated homepage, product, pricing, partner, customer, case study, and release content - Add and replace supporting imagery, illustrations, and Lottie assets used across the site - Adjust layout constants, navigation/footer content, and page-level copy for the updated marketing experience - Update Next.js config and ignore rules to support the new assets and build output ## Testing - Not run (not requested) --------- Co-authored-by: Abdullah <125115953+mabdullahabaid@users.noreply.github.com> |
||
|
|
3a1e112b86 |
Fixes and updates to the website. (#19350)
This PR implements a whole lot of fixes and updates to the website. It adds a release-notes page, terms and conditions page, privacy policy page, while fixing HomeStepper, ProductStepper, and WhyTwentyStepper. 3D models still need to be styled and their sizes need to be fixed. |
||
|
|
22c9693ce5 |
First PR to bring in the new twenty website. (#19035)
This PR contains Menu, Hero, TrustedBy, Problem, ThreeCards and Footer sections of the new website. Most components in there match the Figma designs, except for two things. - Zoom levels on 3D illustrations from Endless Tools. - Menu needs to have the same color as Hero - it's not happening at the moment since Menu is in the layout, not nested inside pages or Hero. Images are placeholders (same as Figma). |