Skip to content

Commit 5b5dd19

Browse files
authored
fix(landing): rename /comparison route to /comparisons for naming consistency (#5651)
Aligns with the /integrations/[slug] convention (plural category, singular item). Adds a 301 redirect (both the bare hub page and every competitor detail page) so previously indexed URLs keep working, and updates every internal reference: footer nav, sitemap generation, and all import specifiers/canonical URLs/breadcrumb JSON-LD within the route itself.
1 parent 7bcae15 commit 5b5dd19

19 files changed

Lines changed: 47 additions & 28 deletions

File tree

apps/sim/app/(landing)/comparison/[provider]/page.tsx renamed to apps/sim/app/(landing)/comparisons/[provider]/page.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@ import type { CompetitorProfile } from '@/lib/compare/data'
44
import { simProfile } from '@/lib/compare/data'
55
import { SITE_URL } from '@/lib/core/utils/urls'
66
import { buildLandingMetadata } from '@/lib/landing/seo'
7-
import { COMPARISON_SECTIONS, getFactGroup } from '@/app/(landing)/comparison/comparison-sections'
8-
import { BrandIconTile, SimIconTile } from '@/app/(landing)/comparison/components/brand-icon-tile'
9-
import { ComparisonCards } from '@/app/(landing)/comparison/components/comparison-cards'
10-
import { ComparisonTable } from '@/app/(landing)/comparison/components/comparison-table'
7+
import { COMPARISON_SECTIONS, getFactGroup } from '@/app/(landing)/comparisons/comparison-sections'
8+
import { BrandIconTile, SimIconTile } from '@/app/(landing)/comparisons/components/brand-icon-tile'
9+
import { ComparisonCards } from '@/app/(landing)/comparisons/components/comparison-cards'
10+
import { ComparisonTable } from '@/app/(landing)/comparisons/components/comparison-table'
1111
import {
1212
ALL_COMPETITORS,
1313
buildBottomLine,
1414
buildComparisonFaqs,
1515
getCompetitorBySlug,
1616
getLatestVerifiedDate,
1717
SIM_LATEST_VERIFIED,
18-
} from '@/app/(landing)/comparison/utils'
18+
} from '@/app/(landing)/comparisons/utils'
1919
import { BackLink } from '@/app/(landing)/components'
2020
import { Cta } from '@/app/(landing)/components/cta/cta'
2121
import { JsonLd } from '@/app/(landing)/components/json-ld'
@@ -57,7 +57,7 @@ export async function generateMetadata({
5757
return buildLandingMetadata({
5858
title: `Sim vs ${competitor.name} | Sim, the AI Workspace`,
5959
description: `Compare Sim, the open-source AI workspace, to ${competitor.name} on platform, AI, integrations, pricing, security, and support. Sourced and dated facts.`,
60-
path: `/comparison/${competitor.id}`,
60+
path: `/comparisons/${competitor.id}`,
6161
keywords: [
6262
`Sim vs ${competitor.name}`,
6363
`${competitor.name} alternative`,
@@ -91,12 +91,12 @@ export default async function ComparisonProviderPage({
9191
'@type': 'BreadcrumbList',
9292
itemListElement: [
9393
{ '@type': 'ListItem', position: 1, name: 'Home', item: baseUrl },
94-
{ '@type': 'ListItem', position: 2, name: 'Comparison', item: `${baseUrl}/comparison` },
94+
{ '@type': 'ListItem', position: 2, name: 'Comparisons', item: `${baseUrl}/comparisons` },
9595
{
9696
'@type': 'ListItem',
9797
position: 3,
9898
name: `Sim vs ${competitor.name}`,
99-
item: `${baseUrl}/comparison/${competitor.id}`,
99+
item: `${baseUrl}/comparisons/${competitor.id}`,
100100
},
101101
],
102102
}
@@ -110,7 +110,7 @@ export default async function ComparisonProviderPage({
110110
'@type': 'ItemList',
111111
name: `Sim vs ${competitor.name}`,
112112
description: `Feature and pricing comparison between Sim and ${competitor.name}.`,
113-
url: `${baseUrl}/comparison/${competitor.id}`,
113+
url: `${baseUrl}/comparisons/${competitor.id}`,
114114
dateModified: latestVerified.toISOString().slice(0, 10),
115115
numberOfItems: 2,
116116
itemListElement: [
@@ -163,7 +163,7 @@ export default async function ComparisonProviderPage({
163163
<main id='main-content' className='bg-[var(--bg)]'>
164164
<div className='mx-auto w-full max-w-[1446px] px-12 pt-[112px] max-sm:px-5 max-sm:pt-20 max-lg:px-8'>
165165
<div className='mb-6'>
166-
<BackLink href='/comparison' label='Back to comparisons' />
166+
<BackLink href='/comparisons' label='Back to comparisons' />
167167
</div>
168168

169169
<div className='flex flex-col gap-4'>

apps/sim/app/(landing)/comparison/comparison-sections.ts renamed to apps/sim/app/(landing)/comparisons/comparison-sections.ts

File renamed without changes.

apps/sim/app/(landing)/comparison/components/brand-icon-tile/brand-icon-tile.tsx renamed to apps/sim/app/(landing)/comparisons/components/brand-icon-tile/brand-icon-tile.tsx

File renamed without changes.

apps/sim/app/(landing)/comparison/components/brand-icon-tile/index.ts renamed to apps/sim/app/(landing)/comparisons/components/brand-icon-tile/index.ts

File renamed without changes.

apps/sim/app/(landing)/comparison/components/comparison-cards/comparison-cards.tsx renamed to apps/sim/app/(landing)/comparisons/components/comparison-cards/comparison-cards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { FactSource } from '@/lib/compare/data'
2-
import { SourceLink } from '@/app/(landing)/comparison/components/source-info'
2+
import { SourceLink } from '@/app/(landing)/comparisons/components/source-info'
33

44
interface ComparisonCardItem {
55
title: string

apps/sim/app/(landing)/comparison/components/comparison-cards/index.ts renamed to apps/sim/app/(landing)/comparisons/components/comparison-cards/index.ts

File renamed without changes.

apps/sim/app/(landing)/comparison/components/comparison-table/comparison-table.tsx renamed to apps/sim/app/(landing)/comparisons/components/comparison-table/comparison-table.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type { ReactNode } from 'react'
22
import { cn } from '@sim/emcn'
33
import type { CompetitorProfile } from '@/lib/compare/data'
4-
import { COMPARISON_SECTIONS, getFactGroup } from '@/app/(landing)/comparison/comparison-sections'
5-
import { BrandIconTile, SimIconTile } from '@/app/(landing)/comparison/components/brand-icon-tile'
6-
import { FactValue } from '@/app/(landing)/comparison/components/fact-value'
4+
import { COMPARISON_SECTIONS, getFactGroup } from '@/app/(landing)/comparisons/comparison-sections'
5+
import { BrandIconTile, SimIconTile } from '@/app/(landing)/comparisons/components/brand-icon-tile'
6+
import { FactValue } from '@/app/(landing)/comparisons/components/fact-value'
77

88
export interface ComparisonTableProps {
99
sim: CompetitorProfile

apps/sim/app/(landing)/comparison/components/comparison-table/index.ts renamed to apps/sim/app/(landing)/comparisons/components/comparison-table/index.ts

File renamed without changes.

apps/sim/app/(landing)/comparison/components/fact-value/fact-value.tsx renamed to apps/sim/app/(landing)/comparisons/components/fact-value/fact-value.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Check, X } from '@sim/emcn/icons'
22
import type { Fact } from '@/lib/compare/data'
3-
import { SourceLink } from '@/app/(landing)/comparison/components/source-info'
4-
import { parseFactValue } from '@/app/(landing)/comparison/fact-status'
3+
import { SourceLink } from '@/app/(landing)/comparisons/components/source-info'
4+
import { parseFactValue } from '@/app/(landing)/comparisons/fact-status'
55

66
export interface FactValueProps {
77
fact: Fact

apps/sim/app/(landing)/comparison/components/fact-value/index.ts renamed to apps/sim/app/(landing)/comparisons/components/fact-value/index.ts

File renamed without changes.

0 commit comments

Comments
 (0)