Homarr Dash. (dashdot) widget shows NaN for ZFS storage
The homarr dashboard's Dash. (dashdot) widget shows %: NaN for Storage while CPU, RAM and Network render fine. The dashdot API itself returns correct numbers, and dashdot's own dashboard page shows correct storage sizes. Host uses ZFS.
Two separate facts, and the fix is in homarr's board config, not dashdot.
1. The NaN is drawn by dashdot, not homarr. homarr's DashDotGraph renders each graph as an iframe into the dashdot instance: <dashdot-url>/?singleGraphMode=true&graph=storage&showPercentage=true&multiView=false&.... Load that URL directly in a browser and you will see the bare %: NaN, which proves it is dashdot's renderer. Note the value is painted on a <canvas>, so it will NOT appear in document.body.innerText or any DOM text search — you can only read it from a screenshot, and it lazy-mounts when scrolled into view.
2. dashdot 6.x cannot compute a ZFS storage percentage in any configuration. Measured with four containers side by side on that same URL:
| 5.2.3 | none | 34.8 |
| 6.3.4 | none | 0.0 |
| 6.3.4 | DASHDOT_FS_VIRTUAL_MOUNTS only | 0.0 |
| 6.3.4 | virtual mounts + DASHDOT_FS_DEVICE_FILTER | NaN |
On ZFS the pool members carry no mounted filesystem, so /load/storage returns -1 per disk. Adding DASHDOT_FS_VIRTUAL_MOUNTS=<pool>,<dataset> makes the API correct; adding DASHDOT_FS_DEVICE_FILTER=sda,... to hide the raw members is what flips 0.0 to NaN, because no non-virtual disk is left to divide by.
Fix — bypass the iframe. homarr's DashDotGraph contains:
if (graph === 'storage' && isCompact) return <DashDotCompactStorage info={info} url={dashDotUrl} />;with isCompact={g.subValues.compactView ?? false}. DashDotCompactStorage computes the value in homarr itself — totalUsed summed from /load/storage, totalSize summed from /info's storage[].size, fetched via homarr's server-side proxy — which is correct against the virtual-mount data.
So in the board JSON (<config>/default.json), find the dashdot widget's graphsOrder entry with key: "storage" and set subValues.compactView to true, then restart homarr. Storage renders as e.g. 51.0% 36404.5 GiB / 71318.8 GiB. Keep the device filter — it is what makes dashdot's own dashboard and API correct, and nothing consumes the broken view any more. Trade-off: storage becomes a text row instead of a sparkline; CPU/RAM/network keep using the iframe.
If the board config file is root-owned via a bind mount, write it through the container to preserve ownership: docker exec -i homarr sh -c 'cat > /app/data/configs/default.json' < new.json.