# HTML format reference (`--format Html`)
`--format Html` produces a self-contained zipped static website. Extract the zip and open `index.html` in any browser — works fully offline, no server needed.
---
## File layout inside the zip
```
Report_20260506_120000.zip
├── index.html ← cover / home page
├── issues.html ← only present when at least one collection failure was recorded
├── network-diagram.html ← network topology page
├── network-diagram.svg ← raw SVG (embedded by network-diagram.html)
│
├── cluster.html
├── cluster-log.html
├── cluster-tasks.html
├── nodes.html ← Nodes overview page
├── nodes/
│ ├── cc01.html ← per-node detail page
│ └── cc02.html
├── vms.html ← VMs overview page
├── vms/
│ ├── 100.html ← per-VM detail page
│ └── 101.html
├── containers.html
├── containers/
│ └── 200.html
├── storages.html
├── storage-content.html
├── backups.html
├── disks.html
├── partitions.html
├── snapshots.html
├── network.html
├── firewall.html
├── replication.html
├── rrd-nodes.html
├── rrd-storages.html
├── rrd-guests.html
├── syslog.html
│
└── assets/
├── style.css ← stylesheet (light + dark)
├── app.js ← shared behaviour (theme, sidebar, lazy groups, export)
├── table.js ← per-table search + click-to-sort
├── sidebar-data.js ← node/VM/container links for the lazy sidebar
└── export-data.js ← CSS + table.js inlined for the standalone export
```
---
## Sections
Pages appear in this order in the sidebar. Conditional pages (`if …`) are only emitted when the matching setting is enabled or when the underlying data exists.
| # | Page | Description | Condition |
|---|------|-------------|-----------|
| 1 | **Home** (`index.html`) | Cover with metadata, filters, hyperlinked Contents table | always |
| 2 | **Issues** (`issues.html`) | Diagnostics for collection failures — see [Issues](#issues) below | only when failures recorded |
| 3 | **Network Diagram** (`network-diagram.html`) | Topology SVG with embedded view | always when the SVG was generated |
| 4 | **Cluster** (`cluster.html`) | Cluster-wide configuration and security (users, ACL, firewall options, backup jobs, HA, SDN, pools, hardware mappings) | `Cluster.Include` |
| 5 | **Nodes** (`nodes.html` + `nodes/.html`) | Node overview → per-node detail pages | always |
| 6 | **VMs** (`vms.html` + `vms/.html`) | VM overview → per-VM detail pages | always |
| 7 | **Containers** (`containers.html` + `containers/.html`) | Container overview → per-CT detail pages | always |
| 8 | **Network** (`network.html`) | Node interfaces + VM/CT NICs (MAC, bridge, VLAN, IPs, model) | always |
| 9 | **Storages** (`storages.html`) | Storage list with size, usage, type | always |
| 10 | **Storage Content** (`storage-content.html`) | Storage files/images with size and VM ID links | `Storage.IncludeContent` |
| 11 | **Backups** (`backups.html`) | Backup files across all storages | `Storage.IncludeBackups` |
| 12 | **Disks** (`disks.html`) | Global VM/CT disk inventory | `Guest.IncludeDisks` |
| 13 | **Partitions** (`partitions.html`) | Guest disk partitions via QEMU agent | `Guest.IncludePartitions` |
| 14 | **Snapshots** (`snapshots.html`) | Global snapshot inventory across all VMs/CTs | `Guest.IncludeSnapshots` |
| 15 | **Firewall** (`firewall.html`) | Cluster + node + VM/CT firewall rules, aliases, IP sets | `Firewall.Enabled` |
| 16 | **Replication** (`replication.html`) | Replication job status across all nodes | `Node.IncludeReplication` |
| 17 | **RRD Nodes** (`rrd-nodes.html`) | Historical performance metrics per node | `Node.RrdData.Enabled` |
| 18 | **RRD Storage** (`rrd-storages.html`) | Historical performance metrics per storage | `Storage.RrdData.Enabled` |
| 19 | **RRD Guests** (`rrd-guests.html`) | Historical performance metrics per VM/CT | `Guest.RrdData.Enabled` |
| 20 | **Syslog** (`syslog.html`) | Parsed systemd journal across all nodes | `Node.Syslog.Enabled` |
| 21 | **Cluster Log** (`cluster-log.html`) | Cluster event log | `Cluster.Log.Enabled` |
| 22 | **Cluster Tasks** (`cluster-tasks.html`) | Recent tasks across the cluster | `Cluster.IncludeTasks` |
> The contents of each page (which tables, which columns) are emitted by the engine and identical across formats — see [`docs/settings.md`](settings.md) for the toggles.
The sidebar groups Nodes / VMs / Containers under expandable headers, and Storage / Performance under synthetic groups, but the underlying ordering is the table above.
---
## Issues
When one or more Proxmox API calls fail during collection (a corrupt RRD file, a `500` from a node, missing permissions on a sub-resource, …), an extra `issues.html` page is emitted as the **second** sidebar link, right after Home. It also appears as the **first** row of the Contents table on the cover. On a healthy cluster the page (and the link) are absent.
| Column | Content |
|---|---|
| Severity | `Warning` (default) — `501 Not Implemented` is silent and never appears here. |
| Section | The logical section where the failure happened (e.g. `RRD Storage`, `Firewall Log`, `Cluster`). **Hyperlinked** to the page where the user can investigate — VM / Node / Storage / global section. |
| Message | Diagnostic line built from the Proxmox response: HTTP status, the API error body and the failing endpoint, joined with `—`. Example: `500 Internal Server Error — got wrong time resolution (60 != 1800) — GET /nodes/orion/storage/local-ceph/rrddata`. |
| Timestamp | When the failure was recorded. |
The page uses the same per-table search and click-to-sort as the rest of the report, so filtering by severity or section is immediate.
---
## HTML-specific behaviour
- **Sidebar** — every page shares the same navigation. Top-level entries are organised into expandable groups (Cluster / Nodes / VMs / Containers / Storage / Performance) plus flat links (Network, Firewall, Replication, Issues, Network Diagram). The current page is highlighted; a search box filters all entries by id or name (numeric queries match by id prefix, e.g. `102` matches `102 — opnsense-cc02` but not `1020 — db`).
- **Light & dark theme** — toggle via the sun/moon icon in the top-right of the sidebar; persisted in `localStorage`, defaults to OS preference (`prefers-color-scheme`).
- **Sortable columns** — click any table header to cycle through ascending → descending → original order. The third click restores the order the engine emitted (e.g. nodes by hostname, snapshots by date).
- **Global filter** — every table with at least 5 rows gets a `Filter rows…` box above it. Match defaults to **contains** (`~`); the toggle on the left switches to **exact** (`=`), useful for short numeric ids where `100` would otherwise also match `1014`, `260509100047`, etc.
- **Per-column filter** — column headers backed by short text, flag, or hyperlinked values carry a hover-revealed funnel icon. Click it to reveal a per-column input. Each has its own `~`/`=` toggle. Global + per-column filters combine with AND.
- **Page-level Index** — every detail page starts with anchor links to the tables on that page.
- **Print stylesheet** — `Ctrl+P` produces a clean printout: sidebar, filters and sort controls hidden, tables compacted with repeating headers.
- **Export button** — every node, VM and container detail page has an **Export** button (top right). One click downloads a self-contained `vms-100-standalone.html` (or similar) with CSS and per-table interactions inlined — paste it into a ticket, email it or drop it on a wiki without sending the full report. The exported page has no sidebar and no cross-page links, but keeps the current theme and the table behaviour.
- **Built for large clusters** — the sidebar lazy-loads its long groups (Nodes, VMs, Containers) from a shared `assets/sidebar-data.js`, so even on **2700+ VM clusters** the report stays fast and the zip stays small. Each detail page only carries its own content; navigation chrome is identical across pages and the browser caches the shared assets.
- **Network topology SVG** — bundled in the same zip and shown via `network-diagram.html`. The SVG carries an explicit `viewBox` and scales correctly inside the report and when opened standalone. See the [network diagram guide](network-diagram.md) for the legend and layout.
> Filters are intentionally minimal — `~`/`=` covers the day-to-day cases. For regex, multi-criteria, range filters or pivots, the `report.xlsx` shipped in the same `.zip` has Excel's full autofilter built-in.