A lightweight, self-hosted dashboard for your homelab services. Built with Go and Skeleton CSS for minimal resource usage.
- πͺΆ Lightweight - Single binary, ~10MB memory usage
- βοΈ Configurable - YAML config file or web UI
- π¨ Themeable - Customize colors, fonts, and favicon via config
- π± Responsive - Works on mobile and desktop
- π Widgets - Uptime Kuma, RSS, System Stats, Clock, iFrame, Header
- πΌοΈ Dashboard Icons - Browse and search 2800+ icons from homarr-labs/dashboard-icons
- π³ Docker Ready - Easy deployment
# Clone or download
git clone https://github.com/hyhenry/statis.git
cd statis
# Edit config
cp config.yaml.template config.yaml
nano config.yaml
# Run
docker-compose up -d# Build
go build -o statis .
# Run
./statis# Install dependencies
go mod download
# Run in development
go run .Access the dashboard at http://localhost:8080
Edit config.yaml or use the web UI at /settings.
title: "My Homelab"
subtitle: "Welcome home"
theme:
primary_color: "#33C3F0"
secondary_color: "#33C3F0"
background_color: "#1a1a2e"
card_color: "#16213e"
text_color: "#eaeaea"
font_family: "system" # Or any Google Font name
favicon: "" # Auto-populated if favicon_name is set
favicon_name: "home-assistant" # Dashboard icon name - auto-downloads
layout:
widget_columns: 4 # Width of widget column (2-6)
service_columns: 8 # Width of service column (12 - widget_columns)
cards_per_row: 3 # Service cards per row (1-5)
services:
- name: "Infrastructure"
items:
- name: "Proxmox"
url: "https://proxmox.local:8006"
icon: "" # Auto-populated if icon_name is set
icon_name: "proxmox" # Dashboard icon name - auto-downloads
icon_text: "π₯οΈ" # Emoji fallback
description: "Hypervisor"
target: "_blank" # Optional: _blank, _self
widgets:
- type: "uptime-kuma"
title: "Service Status"
config:
url: "https://uptime.local:3001"
slug: "status"
collapsed: "true"Statis integrates with homarr-labs/dashboard-icons, providing access to 2800+ service icons.
Option 1: Icon Name (Recommended)
Use icon_name to reference icons by name. They are automatically downloaded and cached locally:
- name: "Proxmox"
icon_name: "proxmox" # Downloads /icons/proxmox.svg automaticallyOption 2: Browse Icons Use the icon picker in the settings UI to search and select icons visually.
Option 3: Upload Custom Icons Drag and drop your own icons (SVG, PNG, JPG, GIF, WebP) via the settings UI.
Option 4: Emoji Fallback
- name: "Custom Service"
icon_text: "π₯οΈ" # Emoji shown if no icon is setSet a custom favicon for the browser tab:
theme:
favicon_name: "home-assistant" # Uses dashboard icon - auto-downloads
# OR
favicon: "/icons/custom.svg" # Use a custom uploaded iconYou can also set the favicon via the Settings UI in the General section.
Visual separator between widget groups:
- type: "header"
title: "Status"
config: {}- type: "uptime-kuma"
title: "Service Status"
config:
url: "https://your-uptime-kuma-instance"
slug: "your-status-page-slug"
collapsed: "true" # Optional: start collapsed- type: "rss"
title: "Tech News"
config:
url: "https://feeds.example.com/rss"
items_per_page: "3" # Items shown per page
refresh: "300" # Refresh interval in seconds- type: "system-stats"
title: "System Usage"
config: {}- type: "clock"
title: "Local Time"
config:
timezone: "local" # Or "America/New_York", "Europe/London", etc.
format: "24h" # Or "12h"- type: "iframe"
title: "Embedded Page"
config:
url: "https://example.com"
height: "300px"| Variable | Default | Description |
|---|---|---|
PORT |
8080 |
HTTP port |
CONFIG_PATH |
./config.yaml |
Path to config file |
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}labels:
- "traefik.enable=true"
- "traefik.http.routers.statis.rule=Host(`dash.yourdomain.com`)"statis/
βββ main.go # Entry point, route registration, embedded assets
βββ internal/
β βββ config.go # Config structs, loading, saving, file watching
β βββ handlers.go # HTTP handlers for index, settings, API config
β βββ widgets.go # Widget proxies (Uptime Kuma, RSS, system stats)
β βββ icons.go # Icon search, download, upload
β βββ assets.go # Font management, asset cleanup
β βββ response.go # JSON response helpers
β βββ util.go # Directory creation, file download utilities
βββ tests/ # Test files
βββ config.yaml # Configuration
βββ icons/ # Downloaded/uploaded icons
βββ fonts/ # Downloaded Google Fonts
βββ templates/
β βββ index.html # Dashboard page
β βββ settings.html # Settings page
βββ static/
β βββ css/
β β βββ custom.css # Imports all CSS modules
β β βββ base.css # CSS variables, typography
β β βββ layout.css # Header, footer, responsive
β β βββ components.css # Service cards, widgets
β β βββ settings.css # Settings page styles
β β βββ modals.css # Modals, icon picker
β β βββ skeleton.css # Grid framework
β β βββ normalize.css
β βββ js/
β βββ widgets.js # Widget initialization and rendering
β βββ settings.js # Settings UI, form handling
β βββ icon-picker.js # Icon picker module
β βββ yaml-editor.js # YAML editor modal
β βββ utils.js # Shared utilities
βββ Dockerfile
βββ docker-compose.yaml
- Add handler function in
internal/widgets.go(for widgets that need a proxy) - Add initialization in
static/js/widgets.js - Add to widget type dropdown in
static/js/settings.js
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Dashboard |
/settings |
GET | Settings page |
/api/config |
GET | Get current config |
/api/config |
PUT | Update config |
/api/widget/uptime-kuma |
GET | Proxy to Uptime Kuma |
/api/widget/system-stats |
GET | Local CPU/RAM usage (Linux only) |
/api/widget/rss |
GET | Fetch and parse RSS/Atom feeds |
/api/icons/search |
GET | Search dashboard icons |
/api/icons/download |
POST | Download icon from CDN |
/api/icons/upload |
POST | Upload custom icon |
/api/assets/clean-unused |
DELETE | Remove unused fonts and icons |
| Feature | Statis | Dashy | Homer |
|---|---|---|---|
| Binary Size | ~8MB | N/A | N/A |
| Memory Usage | ~10MB | ~100MB+ | ~50MB+ |
| Config | YAML + UI | YAML + UI | YAML |
| Widgets | β | βββ | Limited |
| Themes | β | βββ | β |
| Dependencies | None | Node.js | Node.js |
MIT License - feel free to use, modify, and distribute.
Pull requests welcome! Please keep the lightweight philosophy in mind.
