Skip to content

Latest commit

Β 

History

History
100 lines (74 loc) Β· 3.65 KB

File metadata and controls

100 lines (74 loc) Β· 3.65 KB

osctrl frontend

React + TypeScript + Vite SPA for the osctrl admin UI.

Talks exclusively to osctrl-api (port 8081 by default). Served as static files β€” no Node.js server in production.

Important

The frontend is the primary operator UI going forward. The legacy server-rendered osctrl-admin HTML interface is being kept for transition purposes and will be deprecated.

πŸ€” What is the frontend?

The osctrl frontend is the modern operator UI for managing environments, nodes, queries, carves, tags, users, and settings through osctrl-api.

πŸš€ Why it exists

The frontend is where new operator-facing UX improvements are landing. It replaces the legacy server-rendered osctrl-admin experience with a React SPA that talks directly to the API layer.

πŸ—‚ Directory

frontend/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ main.tsx          React 19 entry point
β”‚   β”œβ”€β”€ router.tsx        TanStack Router instance
β”‚   β”œβ”€β”€ routes/           Page components (TanStack Router)
β”‚   β”œβ”€β”€ components/       Reusable UI components (primitives, atoms, data, chrome, forms, feedback)
β”‚   β”œβ”€β”€ features/         Feature modules (one folder per page: nodes, queries, carves, ...)
β”‚   β”œβ”€β”€ api/              Typed API client + generated types
β”‚   β”œβ”€β”€ lib/              Utilities, custom hooks, time formatting
β”‚   └── styles/           Tailwind base + design token CSS
└── tests/
    └── e2e/              Playwright end-to-end tests

🧰 npm scripts

Script Description
npm run dev Start Vite dev server on port 5173, proxying /api to :8081
npm run build Type-check then produce dist/
npm run preview Preview the production build locally
npm run check Run tsc --noEmit (type-check only)
npm run lint Alias for check (linting config added in a later track)
npm test Run Vitest once
npm run test:watch Run Vitest in watch mode
npm run test:e2e Run Playwright e2e tests

πŸ›  Development

πŸ’» Local frontend workflow

# Terminal 1 β€” osctrl API (Go)
make api-dev   # starts osctrl-api on :8081

# Terminal 2 β€” React SPA
cd frontend
npm run dev    # starts Vite on :5173, proxies /api/* to :8081

Open http://localhost:5173 in the browser. Vite's dev proxy forwards all /api/* requests to the running Go API, so auth cookies work as same-origin.

🐳 Docker dev stack

The repository's docker-compose-dev.yml exposes the frontend through osctrl-nginx at:

  • https://localhost:8444 for the frontend SPA
  • https://localhost:8443 for the legacy osctrl-admin HTML interface

In that setup, osctrl-frontend stays internal-only on the Docker network and osctrl-nginx performs TLS termination before proxying requests to it.

πŸ— Production build

make frontend    # runs npm ci + npm run build in frontend/

Output: frontend/dist/. Deploy options:

  1. nginx β€” serve dist/ as the document root, reverse-proxy /api/* to osctrl-api. See deploy/nginx/frontend.conf.example.
  2. Static hosting + CDN β€” upload dist/ to S3/Cloudfront/etc. Configure CORS on the API.
  3. Docker β€” build the multi-stage image at deploy/docker/dockerfiles/Dockerfile-osctrl-frontend (node:22-alpine β†’ nginx:alpine). Single image, no separate Go binary.

βš™οΈ Tech stack

  • React 19 + TypeScript 5 (strict)
  • Vite 7
  • TanStack Router (typed routing)
  • TanStack Query 5 (server state)
  • TanStack Table 8 (headless table)
  • Tailwind CSS v4 via @tailwindcss/vite
  • Radix UI primitives (Γ  la carte)
  • react-hook-form 7 + zod 3
  • Vitest + @testing-library/react + jsdom
  • Playwright (e2e)