Read-only discovery UI for Vouch trust files (VOUCHED.td).
This MVP lets you:
- index public GitHub repos that contain
VOUCHED.tdor.github/VOUCHED.td - automatically reindex tracked repositories in the background (hourly batch)
- search handles and see where they are vouched/denounced
- inspect repository trust lists and user-level trust history
Repository files remain the source of truth.
This repository uses Vouch for contribution trust management.
See CONTRIBUTING.md for details.
- Next.js (App Router)
- Convex (database + indexing logic)
- Tailwind + shadcn UI primitives
- Install dependencies:
bun install- Configure environment:
cp .env.local.example .env.localFill:
NEXT_PUBLIC_CONVEX_URL: client-facing Convex deployment URLCONVEX_HTTP_URL(recommended): server-side Convex URL used by the Next.js index routeINDEXER_SECRET(required): shared secret used between Next.js and Convex for indexing requests (must match in both environments)GITHUB_TOKEN(optional but recommended): used for scheduled background reindexing to improve GitHub API limitsPUBLIC_INDEXING_ENABLED(optional): set totrueto allow public manual indexing in productionPUBLIC_INDEXING_ALLOWED_OWNERS(optional): comma-separated GitHub owners that can be indexed when public indexing is enabledCONVEX_ALLOWED_HOSTS(optional): comma-separated extra allowed hosts forCONVEX_HTTP_URLif you use a custom Convex domainINDEXER_UPSTREAM_TIMEOUT_MS(optional): timeout in milliseconds for Next.js -> Convex indexing requests (default15000)GITHUB_FETCH_TIMEOUT_MS(optional): timeout in milliseconds for Convex -> GitHub API requests (default15000)
By default, public manual indexing is disabled in production unless PUBLIC_INDEXING_ENABLED=true.
- Configure Convex deployment (interactive):
bun run convex:dev- Run Next.js:
bun run devOpen http://localhost:3000.
repositories: tracked repos and index statussnapshots: latest indexedVOUCHED.tdfile snapshot per repoentries: normalized trust entries (vouch/denounce)
- GitHub-only indexing
- Single-file snapshot per repo (latest replaces prior entries)
- No auth/admin panel yet (intentionally read-only UX)
- Private repositories are intentionally rejected to prevent accidental ingestion of non-public data