import type { Metadata } from 'next'; import Link from 'next/link'; import { StatsComposition } from '@/components/stats/stats-composition'; import { StatsDensity } from '@/components/stats/stats-density'; import { StatsHeadline } from '@/components/stats/stats-headline'; import { StatsHistory } from '@/components/stats/stats-history'; import { ConnectorStrip, Note } from '@/components/stats/shared'; import { Container, PageHeader, Section } from '@/components/ui/section'; import { Unavailable } from '@/components/ui/unavailable'; import { api, safe } from '@/lib/api'; import { fmtAgo, fmtDateTime, fmtInt } from '@/lib/format'; import { routes, SITE_NAME, SITE_URL } from '@/lib/site'; export const revalidate = 300; const TITLE = 'Global statistics — satellites, debris, launches and orbital density'; const DESC = 'Live statistics of everything in Earth orbit: active satellites, objects on orbit, debris, rocket bodies, launches since 1957, constellation shares and orbital density by altitude and inclination. Real catalogue data with transparent sources.'; export async function generateMetadata(): Promise { const url = `${SITE_URL}${routes.stats()}`; return { title: TITLE, description: DESC, alternates: { canonical: url }, openGraph: { title: `${TITLE} | ${SITE_NAME}`, description: DESC, url, type: 'website', siteName: SITE_NAME }, twitter: { card: 'summary_large_image', title: `${TITLE} | ${SITE_NAME}`, description: DESC }, }; } export default async function StatsPage() { const [stats, density] = await Promise.all([safe(api.stats()), safe(api.density())]); const snapshot = stats?.data ?? null; return ( {snapshot && (

Computed {fmtAgo(snapshot.computed_at)} · {fmtDateTime(snapshot.computed_at)} · {fmtInt(snapshot.connectors.length)} connectors

)}
{!snapshot ? (
The statistics API did not answer. Live catalogue browsing may still work on /satellites.
) : ( <>
    {[ { href: routes.rankings('constellations'), label: 'Largest constellations', hint: 'by active satellites' }, { href: routes.rankings('operators'), label: 'Largest operators', hint: 'by active payloads' }, { href: routes.rankings('countries'), label: 'Countries', hint: 'by active payloads' }, { href: routes.rankings('countries-debris'), label: 'Debris by country', hint: 'objects on orbit' }, { href: routes.rankings('launches'), label: 'Busiest launch sites', hint: 'launches since 1957' }, { href: routes.rankings('fastest-growing'), label: 'Fastest-growing constellations', hint: 'launched last 365 d vs fleet' }, { href: routes.rankings('congested-shells'), label: 'Most populated LEO shells', hint: '50 km bands, object counts' }, { href: routes.rankings('launch-years'), label: 'Launch years', hint: 'launches and payloads per year' }, ].map((r) => (
  • {r.label} → {r.hint}
  • ))}
Fresh = last success within 3× the connector interval · aging = within 12× · stale beyond that. Orbit class, mission type, constellation membership, activity score and orbital density are derived metrics documented on{' '} /methodology.
)}
); }