Frontend
The frontend is a Next.js 14 application (frontend/, Next 14.2.15, React 18) built with Atlaskit components. It runs as the startupos-frontend Deployment, two replicas when last observed.
Per-role theme
Each role has its own colour palette and layout accents, defined in frontend/src/lib/role-theme.ts. The documentation site you are reading does not use the role themes.
Same-origin calls
The browser calls its own host. The NEXT_PUBLIC_*_URL build settings are empty, so every request is a relative URL such as /api/v1/lms/courses. The ingress sends each /api/v1 prefix to the right service. The frontend therefore needs no cross-origin configuration for its own calls.
An axios client in frontend/src/lib/api.ts adds Authorization: Bearer <token> to each request. It also still sends X-User-Id, X-User-Role and X-Tenant-Id. Services in production ignore those three headers when a verified token is present, and ignore them entirely otherwise. See Authentication model.
Routes the frontend serves itself
Five route handlers under frontend/src/app/api run in the Node server, not in a Quarkus service:
| Route | Purpose |
|---|---|
POST /api/auth/token | Signs a demo persona in against Keycloak and returns an access token. |
POST /api/auth/refresh | Renews the access token from the session cookie. |
POST /api/auth/logout | Clears the cookie and ends the Keycloak session. |
GET /api/status | Public JSON status summary. |
POST /api/ai/enhance | Text enhancement helper. |
They are documented in the Frontend routes reference. These routes exist on the host root only. On the API host the root path goes to the LMS service, so /api/auth/* there is not the frontend.
Pages
The frontend also serves the public status page at /status. See Status page.
Sources: frontend/package.json, frontend/src/app/api/**, frontend/src/lib/api.ts, frontend/src/lib/auth.ts, infra/oci-devops/deploy/ingress.yaml, .agents/tasks/fqdn-migration-deploy/findings.md (empty NEXT_PUBLIC_* values), live Deployment read on 2026-11-07.