Widgets
Each widget follows the same data chain:
React component → React Query hook → Next.js API route (/api/widgets/<name>) → external service (Docker socket, HTTP API, etc.)Widgets never call external services directly from the browser.
Available widgets
| Widget | API route | Data source |
|---|---|---|
| Docker Containers | /api/widgets/docker | Docker socket |
| Tailscale Devices | /api/widgets/tailscale | Tailscale local API |
| Uptime Kuma | /api/widgets/uptime-kuma | Uptime Kuma REST |
| Portainer | /api/widgets/portainer | Portainer REST |
| Prometheus | /api/widgets/prometheus | node_exporter scrape |
| Fail2ban | /api/widgets/fail2ban | log / Fail2ban socket |
| LiteLLM | /api/widgets/litellm | LiteLLM proxy API |
Adding a widget
- Create
src/components/widgets/<name>.tsx - Create
src/app/api/widgets/<name>/route.ts— always verify the NextAuth session - Add the widget to the dashboard grid in
src/app/page.tsx