A lightweight, self-hosted dashboard to monitor and manage your containers, VMs, and services from a single interface.
Most dashboard solutions are either too heavy on resources, read-only, or lack real control over your infrastructure. Nidus was born out of frustration — we needed something that could run comfortably on a low-spec server while still giving full visibility and control. Even with embedded camera streaming (go2rtc), the whole stack stays under 70 MB of RAM.
The name comes from Latin — nidus means "nest". A central hub where all your hosts, containers, and services come together.
| Dashboard | Downloads |
|---|---|
![]() |
![]() |
| Edit Mode | Settings |
|---|---|
![]() |
![]() |
| Login | Mobile | Mobile Sidebar |
|---|---|---|
![]() |
![]() |
![]() |
| Solution | What's missing |
|---|---|
| Homarr | Heavy on RAM (~600 MB+), reported memory leaks, Next.js stack |
| Homepage | Read-only — no container or VM control |
| Heimdall | Bookmarks only, no service integration |
| Dashy / Flame | No Docker or Proxmox management |
| Portainer | Excellent for Docker, but no unified view with Proxmox, Home Assistant, or other services |
Nidus fills the gap: a fast, lightweight dashboard with real container management, service integrations, and a customizable widget layout — all in a single Go binary.
/api/docs/ (enable with NIDUS_ENABLE_DOCS=true)┌──────────────────────────────────────────────────┐
│ Nidus Container │
│ Go backend + Svelte frontend + SQLite + go2rtc │
└───────────────────────┬──────────────────────────┘
│
┌──────────┬───────┼───────────┬──────────┐
│ │ │ │ │
Portainer Proxmox Services Reolink go2rtc
API API (HA, AdGuard, cameras (RTSP →
(CE/EE) Pi-hole, WebRTC)
*arr, Plex,
Jellyfin, etc.)
| Component | Technology | RAM |
|---|---|---|
| Backend | Go (Chi router) | ~20-30 MB |
| Frontend | Svelte 5 (compiled → static, embedded in binary) | 0 MB server-side |
| Streaming | go2rtc (embedded) | ~30-40 MB |
| Database | SQLite | Included |
| Deployment | Docker Compose | Single container |
docker run -d -p 3777:3777 -v nidus-data:/data ghcr.io/tdebuilt/nidus-dashboard:latest
Open http://localhost:3777 — the setup wizard will guide you through creating your account and connecting your services.
Create a docker-compose.yml:
services:
nidus:
image: ghcr.io/tdebuilt/nidus-dashboard:latest
container_name: nidus
ports:
- "3777:3777"
volumes:
- ./data:/data
environment:
- NIDUS_DB_PATH=/data/nidus.db
restart: unless-stopped
Then run:
docker compose up -d
Download the binary for your platform from GitHub Releases:
| Platform | Binary |
|---|---|
| Linux (x64) | nidus-x86_64-unknown-linux-gnu |
| macOS (Intel) | nidus-x86_64-apple-darwin |
| macOS (Apple Silicon) | nidus-aarch64-apple-darwin |
| Windows | nidus-x86_64-pc-windows-msvc.exe |
chmod +x nidus-*
./nidus-x86_64-unknown-linux-gnu
# Open http://localhost:3777
Native desktop installers are available from GitHub Releases:
| Platform | Format |
|---|---|
| Linux | .deb, .AppImage |
| macOS | .dmg |
| Windows | .msi |
The desktop app embeds the full Nidus stack (Go backend + Svelte frontend) via Tauri.
| Variable | Default | Description |
|---|---|---|
NIDUS_PORT |
3777 |
HTTP server port |
NIDUS_BASE_URL |
http://localhost:3777 |
External URL (for reverse proxy setups) |
NIDUS_DB_PATH |
./data/nidus.db |
Path to the SQLite database file |
NIDUS_ENABLE_DOCS |
false |
Enable Swagger UI at /api/docs/ |
Configuration can also be set via a config.yaml file. See docs/DEPLOYMENT.md for details.
| Port | Description |
|---|---|
3777 |
HTTP server (web UI + API + Swagger) |
1984 |
go2rtc API (camera streaming, managed internally) |
| Volume | Description |
|---|---|
/data |
SQLite database, config, encryption keys — back this up |
| Module | Connection | Features |
|---|---|---|
| Docker | Portainer API (CE + EE) | Stacks & containers: start/stop/restart/update, CPU & RAM stats |
| Proxmox | Proxmox API (token auth) | VMs/LXCs: status, metrics, start/stop |
| Home Assistant | HA REST + WebSocket API | Any entity as widget with real-time actions |
| AdGuard | AdGuard Home API | Query stats, toggle filtering |
| Pi-hole | Pi-hole API | DNS stats, blocked queries, toggle filtering |
| JDownloader | MyJDownloader API | Add links, manage queue |
| Transmission | Transmission RPC API | Add torrents, pause/resume |
| qBittorrent | qBittorrent Web API | Add torrents, pause/resume, search, sort, paginate |
| Plex | Plex API | Active sessions, now playing |
| Jellyfin | Jellyfin API | Active sessions, now playing |
| Sonarr / Radarr | *arr API | Calendar, download queue, status |
| Lidarr / Prowlarr | *arr API | Music library, indexer status |
| Uptime Kuma | Uptime Kuma API | Monitor status, uptime %, latency |
| Reolink | RTSP via embedded go2rtc | Live camera streams (WebRTC) |
| Grafana | Grafana API | Embed panels, dashboard picker |
| Weather | OpenWeatherMap API | Current + 5-day forecast |
| Calendar | iCalendar (ICS) | Upcoming events from any ICS URL |
| RSS | RSS/Atom feeds | Aggregated article list |
| System | Linux /proc | Host CPU, RAM, disk, uptime |
| Finance | Market data API | Stock ticker, price tracking |
All modules are configured via the UI during setup or in settings.
See ROADMAP.md for the full roadmap.
Completed:
Coming next:
plugins/ directorymake dev # Run Go backend + Svelte dev server (hot reload)
make test # Run all tests (backend + frontend)
make test-backend # Go tests only
make test-frontend # Vitest only
make test-e2e # Playwright E2E tests (builds app first)
make test-e2e-headed # E2E tests with visible browser
make lint # Run all linters (Go + frontend)
make build # Production build (Svelte → embed → Go binary)
make docker # Build and run via Docker Compose
make desktop-dev # Run Tauri desktop app in dev mode
make setup # Configure git hooks