# portal-frontend Session 2's Angular portal — the real UI over the new backend, reachable at **http://localhost:8080/portal** once the stack is up (`docker compose up -d` from the repo root). It is served by its own nginx container behind the shared proxy, *not* by `ng serve`. The whole app is driven off the API's `actions` and `seams` blocks: it renders whatever write path each case advertises (`writeThrough`, `redirect`, `owned`, `transition`, `query`) and never builds an endpoint URL from an id. That is what makes the same screens work unchanged for a legacy-owned case and an adopted one — see [`docs/architecture.md`](../docs/architecture.md). ``` npm test # unit tests (vitest, via ng test) npm run build # production build ``` This app is **zoneless**: state written from a `subscribe` callback must land in a signal, or the DOM will not update.