Frontend dashboard for oops — a Kubernetes-native test runner.
oops-ui shows test scenario executions triggered by pull requests and job. It displays run statuses, scenario results, pass/fail summaries, and allows looking up historical run results by run ID. It communicates with oopshubd (the oopshub gRPC backend) via oopshubproxyd, a grpc-gateway HTTP proxy running on Cloud Run.
| Framework | React 18 + TypeScript |
| Build tool | Vite |
| Styling | Tailwind CSS |
| Routing | React Router v7 |
| State management | Zustand |
| HTTP client | Axios |
| Auth | Google OAuth via @react-oauth/google + JWT decode |
| Data fetching | @tanstack/react-query |
| i18n | i18next + react-i18next |
- Node.js 18+
- Access to GCP with permissions to impersonate SA
- The
oopshubproxydbinary built fromouchan/cloudrun/oopshubproxyd
npm installcp .env.local.sample .env.localEdit .env.local if needed (default port is 4000).
The Vite dev server proxies /oopshub/* requests to a local oopshubproxyd instance,
which in turn authenticates and forwards them to oopshubd on Cloud Run.
Build the proxy binary (from the repo root):
cd ../ouchan
go build -o /tmp/oopshubproxyd ./cloudrun/oopshubproxyd/...Start it:
AUDIENCE=https://oopshubd-next-30705341751.asia-northeast1.run.app \
/tmp/oopshubproxyd -addr :4000The proxy uses your local Application Default Credentials (ADC). Make sure you are authenticated:
npm run devOpen http://localhost:3000/oops-ui.
src/
components/ # Shared UI components
uikit/ # Generic reusable components (StatusBadge, Loading, etc.)
config/ # App-level config (reads from env vars)
core/ # App infrastructure (RequireAuth, etc.)
layouts/ # Page layout components (Sidebar, etc.)
pages/ # Route-level page components
services/ # API clients (api.ts)
store/ # Zustand state stores
types/ # Shared TypeScript types
auth.ts # Auth-related types
oopshub.ts # Oopshub API types
test.ts # Test run / scenario types
ui.ts # UI component types