# Dashboard performance in Chrome
Measured on the busiest board of a restored real backup: 28 items, 16 widget kinds.
## Where the board's cost actually is
`scripts/benchmarks/measure-widget-cost.mts` attributes DOM nodes and React fibers to each widget by
walking the fiber subtree hanging off its DOM node. Totals do not tell you what to fix; this does.
Board totals: **9,293 DOM nodes, 8,165 event listeners, 86.3 MiB JS heap, 28 widgets.**
| nodes | each | fibers | each | n | widget kind |
| --- | --- | --- | --- | --- | --- |
| **2,951** | 2,951 | **8,387** | 8,387 | 1 | **mediaReleases** |
| 1,156 | 1,156 | 3,231 | 3,231 | 1 | beszelSystemStats |
| 451 | 451 | 1,286 | 1,286 | 1 | beszelSystemTable |
| 393 | 393 | 1,204 | 1,204 | 1 | mediaRequests-requestList |
| 313 | 313 | 669 | 669 | 1 | beszelSystemGrid |
| 265 | 265 | 900 | 900 | 1 | downloads |
| 251 | 251 | 1,195 | 1,195 | 1 | calendar |
| 177 | 177 | 390 | 390 | 1 | dockerContainers |
| 88 | 8 | 528 | 48 | 11 | app |
| 62 | 21 | 297 | 99 | 3 | umami |
**One widget is 44% of the board's DOM.** `mediaReleases` contains **1,935 Mantine `Box`
components** on its own.
## Why: it renders 13× more than the tile can show
Measured directly on that widget:
| | |
| --- | --- |
| tile height | **539 px** |
| content height | **7,206 px** |
| cards rendered | **80** |
| cards visible | **7** |
| nodes per card | 34 |
| `
` elements | 80 |
| `