Two Provider Contracts
Clouds implement one CloudProvider interface -
listComputeServices, listVirtualMachines, listManagedDatabases,
listRegistries, getCostBreakdown, listBudgets,
health - so the Infra pages are cloud-agnostic. SaaS tools implement a single
SaaSConnector.fetch(), registered in one index. Adding an integration is one module, not a
new page.
src/
├── app/(app)/ # console pages: infra, mobile, observability, app-ops, alerts
├── app/api/ # auth, health, cron/{evaluate,cost-snapshot,demo-refresh}
├── lib/cloud/ # CloudProvider: gcp, aws (SigV4), azure + discovery + token minting
├── lib/connectors/ # 17 SaaS connectors behind one SaaSConnector contract
├── lib/appdata/ # read-only reader for the builder's own Postgres
├── lib/vault/ # envelope encryption, Cloud KMS wrap/unwrap
├── lib/alerts/ # rules, metrics, engine, delivery channels, uptime probe
└── lib/db/, lib/tenant/ # tenant-scoped Prisma client + AsyncLocalStorage context