The Overview page: the landing screen that shows what the deployment is doing right now, what it did today, the
newest rooms and whether the analytics writer, schema and migration are healthy.
## Requirements
### Requirement: Overview route and layout
Edition: CE. `/overview` SHALL read only `tz` from the URL, show the page title, the live chip and the refresh
control in its header, and render, in order: live tiles (balanced tile rows), the today card next to the server status
card, and the recent rooms table next to the per-node card.
#### Scenario: Default landing
- **GIVEN** an authenticated user without a stored default zone, in a browser whose zone is Europe/Madrid
- **WHEN** the application opens `/`
- **THEN** it redirects to `/overview?tz=Europe/Madrid`, requests `GET /api/v1/overview?tz=Europe/Madrid` and shows the header with "LIVE", "updated hh:mm:ss" and the interval select
#### Scenario: Phone width
- **WHEN** the viewport is narrower than 600 px
- **THEN** tiles render two per row, the cards stack and the recent rooms table switches to cards
### Requirement: Live KPI tiles
Edition: CE. Six KPI tiles SHALL show Active rooms, Participants, Publishers, Egress, Ingress and Agents from `live`,
keep the last value while refreshing, highlight changes, and link to the list filtered to the live entities:
Publishers to `/participants?status=active&publisher=true` and Agents to `/agents?status=active`; a tile's info icon
is not part of its link.
#### Scenario: Tile values and links
- **GIVEN** CE, and `live` with `rooms: 12`, `participants: 85`, `publishers: 54`, `participantsByKind``{ EGRESS: 3, AGENT: 2 }`, `egresses: 3` and `ingressSessions: 1`
- **THEN** they read 12, 85, 54, 3, 1 and 2, and they link to `/rooms?status=active`, `/participants?status=active`, `/participants?status=active&publisher=true`, `/egress?status=active`, `/ingress?status=publishing` and `/agents?status=active`
- **GIVEN** the auto-refresh set to Off and a fresh writer
- **WHEN** the chip renders
- **THEN** it reads "paused" with the tooltip "Auto-refresh is off · data from hh:mm:ss"
#### Scenario: Slow writer batches
- **GIVEN** a status with `writer.batchIntervalMs: 60000`, whose fresh window is 95 s, and `writer.lastSeenAt` 80 s before its `generatedAt`
- **WHEN** the chip renders
- **THEN** it reads "LIVE"
### Requirement: Today tiles
Edition: CE. A card titled "Today (<zone>, since 00:00)" SHALL show Rooms, Participants, Minutes, Egress and
Ingress from `today`, with a "≈" prefix and tooltip when `approximate` is `true`, and the hint "No rooms today yet"
when every counter is `0`; Participants and Minutes are explained by their info tips, and no tile carries a tooltip
of its own.
#### Scenario: Approximate zone
- **GIVEN** `today` with `tz: "Asia/Kolkata"`, `rooms: 143` and `approximate: true`
- **WHEN** the card renders
- **THEN** the title names "Asia/Kolkata", Rooms reads "≈ 143" and the tooltip of the "≈" explains the hour-aligned sum
#### Scenario: Minutes explained
- **WHEN** the user hovers the Minutes tile outside its info icon
- **THEN** no tooltip shows, and its info icon reads "Minutes of the participant sessions that ended today."
### Requirement: Recent rooms table
Edition: CE. The table SHALL show the 10 `recentRooms` in the column order of the Rooms list: SID, Name, Status,
Started, Duration and Unique identities, with no live chip, plus a "View active rooms" link while there are active rooms
and a "View all rooms" link while there are recent rooms.
#### Scenario: Active row
- **GIVEN** an active room `demo-room``RM_ab12cd` created at 12:31 with 6 unique identities, 5 of them active, and fresh stats
- **WHEN** the row renders
- **THEN** the cells read, in order, `RM_ab12cd` once (linking to `/rooms/RM_ab12cd` with its copy button), `demo-room` with its copy button, "active" without a live chip, the start time, the live duration and 6, and "View active rooms" links to `/rooms?status=active`
#### Scenario: Stale active row
- **GIVEN** an active room that the overview response marks `stale: true`, with `lastStatsAt` at 12:31:05
- **WHEN** the row renders
- **THEN** its status badge carries the clock cue with the tooltip "No stats since 12:31:05"
#### Scenario: Fresh row while the auto-refresh is off
- **GIVEN** the auto-refresh set to Off and an active room without `stale` in the last overview response
- **WHEN** ten minutes pass without a new overview response
- **THEN** its status badge carries no stale cue
#### Scenario: Closed row
- **GIVEN** a closed room with `participants.unique: 9` and 14 sessions
- **WHEN** the row renders
- **THEN** the Unique identities cell reads 9 and the column header reads "Unique identities"
#### Scenario: Narrow card
- **GIVEN** the Recent rooms card narrower than the table's columns on a wide viewport
- **WHEN** the table renders
- **THEN** every column shows, Started with the time-zone hint in its header, and the table scrolls sideways inside
the card
#### Scenario: No rooms to list
- **GIVEN** an overview with no active room and no recent room
- **WHEN** the card renders
- **THEN** neither "View active rooms" nor "View all rooms" is shown
#### Scenario: Columns
- **WHEN** the table renders a recent room
- **THEN** SID links to `/rooms/{sid}` with a copy button, Name has a copy button, Status shows the badge with the
estimated outline for `closedBy: "reconciler"` and the stale cue of `stale: true`, Started carries the time-zone
header hint, Duration is live while active and Unique identities shows `participants.unique` in every state
### Requirement: Stale entities hint
Edition: CE. When two consecutive overview responses, a `304` included, have
`live.stale.rooms + live.stale.participants > 0`, the page SHALL show the shared warning notice under the tiles naming
- **THEN** the empty state reads "Waiting for the first events", every tile reads 0, the status card shows "Last batch: never" and "no node has reported yet" with warning icons, and no error banner is shown
Edition: CE. The page SHALL follow the shared auto-refresh policy with the live-view default of 10 s, send
`If-None-Match`, re-render only on `200`, keep the last values and show the error banner with retry on failure,
and expose the latest `live` counters to other pages through a shared service.
#### Scenario: Failed poll
- **GIVEN** the tiles showing the last response
- **WHEN** a poll fails with `500`
- **THEN** the values stay, the error banner shows the message, request id and retry, and the next tick follows the back-off
### Requirement: Per-node cards
Edition: CE. Without `per-node-breakdown` the "By node" card next to the recent rooms table SHALL render the lock
for `per-node-breakdown` without any request of its own.
#### Scenario: Locked in CE
- **GIVEN** `features` without `per-node-breakdown`
- **WHEN** the page renders
- **THEN** the card shows the lock with "Per-node breakdown is available in OpenVidu PRO" and its link, and the page requests nothing besides `GET /api/v1/overview` and the shell's status poll