The Problem
Self-hosted homelab dashboards like Homarr or Homepage typically require a backend service, a database, and a configuration format you must learn. Hestia-core removes that dependency entirely: it is a grid-based dashboard that runs as static HTML/CSS/JS in the browser, with configuration persisted to localStorage and IndexedDB. The trade-off is that any service integration (Glances, Pi-hole, Deluge, Jellyfin) must be reachable from the browser, which is why the included Docker image wraps an Nginx proxy to handle CORS.
What This Does
Hestia is a modular dashboard framework. The core grid logic lives in js/grid/virtualGrid.js, with widget rendering and drag-and-drop handled by js/grid.js and js/events.js. Apps are registered as modules under js/apps/ — each one is a self-contained object (e.g., js/apps/glancesApp.js for Glances, js/apps/piholeApp.js for Pi-hole) that plugs into a registry in js/registry.js.
Theming is a first-class feature: js/palettes.js implements Base16 palettes (Dracula, Nord, Monokai), and js/ui/theme.js plus js/ui/settingsPanel.js let users customize gaps, radii, fonts, and shadows, then export the whole layout and theme as a JSON file. The UI layer (js/ui/modal.js, js/ui/toasts.js, js/ui/popover.js) is generic and reused across apps.
How To Use It
Setup (Docker, recommended): Build the image from the Dockerfile and run it. The Nginx config in default.conf proxies API calls to /pi-api, /deluge-api, and /jellyfin-api to avoid CORS issues — but you must edit default.conf to point at your actual server IPs before building.
git clone https://github.com/mult1v4c/hestia-core cd hestia-core edit default.conf with your server IPs first docker build -t hestia-core . docker run -d -p 8080:80 --name hestia hestia-core
Setup (static): Serve the directory with any web server, e.g. python3 -m http.server 8000. External API integrations may fail due to CORS without the proxy.
Configuration: No environment variables or config files required. All configuration happens through the UI and is saved to localStorage. Image uploads go to IndexedDB via js/imageStore.js.
Running it: Open the served URL in a browser. The entry point is index.html, which loads js/main.js to bootstrap the grid and app registry.
Real-World Use
A homelab operator with a Proxmox server running Glances, a Pi-hole for DNS, and a Jellyfin media server can run Hestia as a single Docker container on a Raspberry Pi. They add a Glances app widget, point it at /glances-api, and get CPU/memory/disk graphs on a dashboard that survives browser refreshes without any backend state. The export-to-JSON feature lets them back up the layout to a git repo.
Code Health & Issues
Med (SDLC) — No test files detected anywhere in the repo. The grid and app logic in js/grid.js and js/apps/* are untested, which is a real risk for a drag-and-drop UI. Med (SDLC) — No CI/CD pipeline (no .github/ or CI config). Nothing gates regressions on merge. Low (Security) — The Docker image ships with a default Nginx config (default.conf) that expects the user to edit IPs; a misconfigured proxy could expose internal services. The README notes this, but there is no validation. Low (Maintainability) — The codebase is flat and modular, but js/ has 53 files with no build step or module bundler, so dependency order in index.html matters and is easy to break.
The Bottom Line
Hestia-core is a genuinely useful, well-scoped dashboard for homelab users who want a zero-backend, purely client-side solution with deep theming. The lack of tests and CI makes it a personal-project-grade tool rather than something you'd deploy for a team, but for a single-operator homelab it solves a real problem cleanly. Use it if you want a customizable dashboard without running a Node or Python backend.