Appearance
Widgets overview
A widget attaches live data to a service card. Home Lab ships with native integrations for 30+ services - no separate proxy containers to run. The backend fetches the data, caches it briefly, and the card renders it.
How a widget is configured
Widgets are configured in the service dialog, not in a separate settings tab:
- Open a service (Add service, or edit an existing card).
- Pick a Widget type from the dropdown.
- A credentials box appears with exactly the fields that type needs - typically a URL, an API key / token, and a Refresh (ms) interval, plus any type-specific fields.
- Save. The card starts showing live data.
The widget type is what decides which integration runs - it always wins over the service's name. Pick it explicitly from the dropdown.
How data is fetched
- The backend resolves the widget type to an integration handler and calls the service's API with your credentials.
- Results are cached for a short TTL (the widget's refresh interval, or a default) so frequent UI refreshes don't hammer the upstream service.
- The browser polls each widget on its refresh interval and updates the card.
- Secrets stay server-side - the browser never receives your API keys.
Refresh interval
Every widget has a Refresh (ms) field (default ~10 000 ms). Lower it for fast-moving data (download speeds), raise it for slow data (backup jobs) to be gentle on the upstream API.
Credential fields
Common fields you'll see:
| Field | Meaning |
|---|---|
| URL | Base URL of the service |
| API key / token / password | Authentication (stored server-side) |
| Refresh (ms) | How often to poll |
| Type-specific | e.g. Topic for ntfy, Device ID for Tailscale, Days for Jellystat |
The full per-type field list is in the Widget reference.
Categories
Jellyfin, Plex, Emby, Jellyseerr/Overseerr, Tautulli, Jellystat, recently-added posters, and the *arr suite.
Next steps
- Multiple widgets per service
- Widget reference - every type and its fields