import type { Metadata } from 'next'; import Link from 'next/link'; import { SitesMap } from '@/components/launches/sites-map'; import { Container, PageHeader } from '@/components/ui/section'; import { Unavailable } from '@/components/ui/unavailable'; import { api, safe } from '@/lib/api'; import { fmtDate, fmtInt, num } from '@/lib/format'; import { routes, SITE_URL } from '@/lib/site'; export const metadata: Metadata = { title: 'Launch sites — every spaceport that put an object in orbit', description: 'World map and table of launch sites: total launches, activity over the last 365 days, payloads and most recent launch, derived from SATCAT launch-site codes.', alternates: { canonical: routes.launchSites() }, openGraph: { title: 'Launch sites of the world', description: 'Spaceports ranked by orbital launches, with recent activity and last launch.', url: `${SITE_URL}${routes.launchSites()}` }, twitter: { card: 'summary_large_image', title: 'Launch sites of the world', description: 'Spaceports ranked by orbital launches, with recent activity and last launch.' }, }; export default async function LaunchSitesPage() { const res = await safe(api.launchSites()); const sites = res ? [...res.data].sort((a, b) => (num(b.launches) ?? 0) - (num(a.launches) ?? 0)) : null; const active365 = sites?.filter((s) => (num(s.launches_last_365d) ?? 0) > 0).length ?? null; return ( Infrastructure · {sites ? {fmtInt(sites.length)} sites · {fmtInt(active365)} active in the last 365 days : 'count unavailable'}} title="Launch sites" lede="Every launch site referenced by a catalogued object, from Baikonur in 1957 to today's commercial pads. Marker area is proportional to the number of orbital launches attributed to the site." /> {sites === null ? ( ) : ( <>
{sites.map((s) => { const recent = num(s.launches_last_365d) ?? 0; return ( ); })}
Site Code Country Launches Last 365 d Payloads First launch Last launch
{s.name} {s.latitude === null && no coordinates} {s.code} {s.country_code ? {s.country_name ?? s.country_code} : '—'} {fmtInt(s.launches)} {fmtInt(s.launches_last_365d)} {fmtInt(s.payloads)} {fmtDate(s.first_launch)} {fmtDate(s.last_launch)}
)}

Sites and coordinates come from the SATCAT launch-site code table; launches are derived from international designators (see methodology). Sea launches and air launches are attributed to their reference site.

); }