SPB Git forge
38commits 1branches 0releases
338.7 MBsize
maindefault branch
6 h agolast push
HTML 53.9% TypeScript 44.5% JavaScript 0.6% SQL 0.5%
5.8 KB · 101 lines tsx
Raw Blame History
1import type { Metadata } from "next";2import Link from "next/link";3import { LogoMark } from "@/components/brand/logo";4import { Page, PageHeader, Section } from "@/components/ui/card";5import { routes } from "@/lib/routes";67export const metadata: Metadata = {8  title: "About",9  description: "What DataCenterIndex is, how it is built, who makes it and where the data comes from.",10  alternates: { canonical: "/about" },11};1213const LICENSES = [14  { name: "PeeringDB", what: "Facilities, internet exchanges, networks and their presence.", license: "PeeringDB data licence (CC0-like, attribution requested)", url: "https://www.peeringdb.com" },15  { name: "OpenStreetMap", what: "Building footprints, addresses and coordinates for geocoding.", license: "© OpenStreetMap contributors — ODbL 1.0", url: "https://www.openstreetmap.org/copyright" },16  { name: "Wikidata", what: "Operator identities, aliases, parent companies, external identifiers.", license: "CC0 1.0", url: "https://www.wikidata.org" },17  { name: "World Bank", what: "Country population, GDP and electricity indicators.", license: "CC BY 4.0", url: "https://data.worldbank.org" },18  { name: "Operator and government sources", what: "Facility pages, press releases, planning filings, utility and regulator publications.", license: "Facts only; each value links to its source page and licence recorded per source.", url: routes.sources() },19];2021export default function AboutPage() {22  return (23    <Page className="max-w-[880px]">24      <PageHeader eyebrow="About" title="An index, not a directory." description="DataCenterIndex is the structured, versioned graph of the world's data center infrastructure — and its history." />2526      <div className="prose-dci flex flex-col gap-8 text-[14.5px] leading-relaxed text-ink-2">27        <Section title="What it is">28          <p>29            Facilities, campuses, operators, cloud regions, metros, countries, projects, internet exchanges, power and connectivity, linked into one graph. Every field — a capacity in MW, an opening date, a coordinate, a status — carries its provenance: the source, the URL, when it was first and last observed, how it was extracted, and a confidence level. When a source changes, the change is detected, versioned and published to the{" "}30            <Link href={routes.live()} className="text-ink underline decoration-hair-2 hover:text-accent">31              live feed32            </Link>33            .34          </p>35          <p className="mt-3">36            We never invent data. Totals are lower bounds computed from known figures only; estimates are flagged ≈; city-level coordinates are labelled as such and drawn as hollow rings on the map.37          </p>38        </Section>3940        <Section title="How it is built">41          <p>42            A homemade connector platform follows a fixed pipeline: discover → fetch → archive → extract → normalize → reconcile → validate → version → detect changes → publish. Crawling is polite and legal: robots.txt is respected, hosts are rate-limited, unchanged pages are never refetched, no paywall or CAPTCHA is bypassed. Entity resolution merges records across sources only above a strict similarity threshold; ambiguous matches are reviewed by a human.43          </p>44          <p className="mt-3">45            <Link href={routes.methodology()} className="text-ink underline decoration-hair-2 hover:text-accent">46              Read the methodology47            </Link>{" "}48            for confidence scoring, ranking rules and coverage caveats, or browse the{" "}49            <Link href={routes.sources()} className="text-ink underline decoration-hair-2 hover:text-accent">50              source registry51            </Link>52            .53          </p>54        </Section>5556        <Section title="Data attribution and licences">57          <ul className="divide-y divide-hair">58            {LICENSES.map((l) => (59              <li key={l.name} className="grid gap-1 py-3 sm:grid-cols-[160px_minmax(0,1fr)] sm:gap-4">60                <a href={l.url} target="_blank" rel="noopener noreferrer" className="font-medium text-ink hover:text-accent">61                  {l.name}62                </a>63                <div>64                  <div>{l.what}</div>65                  <div className="mt-0.5 text-[12.5px] text-ink-3">{l.license}</div>66                </div>67              </li>68            ))}69          </ul>70          <p className="mt-3 text-[12.5px] text-ink-3">Map tiles: OpenFreeMap · © OpenMapTiles · © OpenStreetMap contributors.</p>71        </Section>7273        <Section title="Who makes it">74          <div className="flex items-start gap-4">75            <LogoMark size={40} className="mt-1 text-ink" />76            <div>77              <p>78                Built and maintained by <span className="font-medium text-ink">Simon-Pierre Boucher</span>. Questions, corrections, data partnerships or API access:{" "}79                <a href="mailto:contact@spboucher.ai" className="text-ink underline decoration-hair-2 hover:text-accent">80                  contact@spboucher.ai81                </a>82                .83              </p>84              <p className="mt-2">85                Hosted on{" "}86                <a href="https://www.maclustr.io" target="_blank" rel="noopener noreferrer" className="text-ink underline decoration-hair-2 hover:text-accent">87                  MacLustr (www.maclustr.io)88                </a>89                , a distributed Apple-silicon compute cluster, with dedicated servers for the data and crawl tiers.90              </p>91              <p className="mt-2 text-[12.5px] text-ink-3">92                Public API: <Link href={routes.apiDocs()} className="underline decoration-hair-2 hover:text-ink">/api/v1/docs</Link> — same envelope, same provenance as the site.93              </p>94            </div>95          </div>96        </Section>97      </div>98    </Page>99  );100}101