import type { Metadata } from 'next';
import Link from 'next/link';
import { Check } from 'lucide-react';
import { PageHeader, Section, Note } from '@/components/ui/section';
import { Badge, StatusBadge } from '@/components/ui/badge';
import { EmptyState } from '@/components/ui/empty-state';
import { Freshness } from '@/components/ui/freshness';
import { listSources, COVERAGE_DOMAINS, sourceDomains } from '@/lib/queries/sources';
import { fmtDate, fmtInt, humanize, relativeTime } from '@/lib/format';
export const metadata: Metadata = { title: 'Sources', description: 'Public catalog of every data source: license status, access, coverage matrix and connector health.' };
export const revalidate = 600;
export default async function SourcesPage() {
const sources = await listSources();
return (
{sources.length === 0 ? (
Run `pnpm cix sources:sync` to seed the registry from connector manifests.
) : (
Source
{COVERAGE_DOMAINS.map((d) => (
{d}
))}
License
Status
{sources.map((s) => {
const dom = sourceDomains(s);
return (
{s.name}
{s.organization ?? humanize(s.category)}
{COVERAGE_DOMAINS.map((d) => (
{dom.has(d) ? : · }
))}
{s.license_status}
);
})}
Source
Category
Access
License
Redistribution
Health
Last success
Records
Dataset version
{sources.map((s) => (
{s.name}
{s.slug}
{humanize(s.category)}
{s.access_type} · {humanize(s.access_auth)}
{s.license ?? — }
{humanize(s.redistribution)}
{s.last_success_at ? relativeTime(s.last_success_at) : '—'}
{fmtInt(s.record_count)}
{s.last_dataset_version ?? '—'}
))}
((m, s) => (s.last_run_finished_at && (!m || s.last_run_finished_at > m) ? s.last_run_finished_at : m), null)} />
License status meanings — approved: reviewed, may be ingested and displayed with attribution · review: terms under assessment, no public records · restricted: displayed with limits · blocked: not usable. See each source page for the plain-language summary.
)}
);
}