Manage your homelab from chat, AI tools, or the terminal. One binary. Zero dependencies.
A single-binary CLI + MCP server that lets you monitor servers, control Docker, wake machines, and scan your network โ from chat, AI tools, or the command line.
Why homebutler?
Other tools give you dashboards. homebutler gives you a tool layer you can use from chat, AI tools, or the terminal.
The clearest story in homebutler today is watch:
- detect service restarts
- capture crash evidence
- spot flapping loops
- review incidents later
That makes it useful both as a normal CLI and as the execution layer under tools like OpenClaw.
๐ Comparison with alternatives
| homebutler | Glances/btop | Netdata | CasaOS | |
|---|---|---|---|---|
| TUI dashboard | โ Built-in | โ | โ Web | โ Web |
| Web dashboard | โ Embedded | โ | โ | โ |
| Single binary | โ | โ | โ | โ |
| Optional web server | โ On-demand | Always-on | Always-on | Always-on |
| Multi-server SSH | โ Parallel | โ | โ | โ |
| MCP support | โ Built-in | โ | โ | โ |
| Chat integration | โ Native | โ | โ | โ |
| AI-friendly JSON | โ | โ | ||
| Docker control | โ | โ | โ | |
| Wake-on-LAN | โ | โ | โ | โ |
| Network scan | โ | โ | โ | โ |
| Remote deploy | โ One command | โ | โ | โ |
| Air-gapped install | โ Copy binary | โ Docker | โ Docker | |
| Resource usage | Low single-binary footprint | Medium | High | High |
Features
- App Install โ Deploy 15 self-hosted apps with one command (
uptime-kuma,jellyfin,pi-hole, and more) - System Status โ CPU, memory, disk, uptime at a glance
- Docker Management โ List, restart, stop, logs for containers
- Multi-server โ Manage remote servers over SSH (key & password auth)
- Notifications โ Multi-channel notifications via Telegram, Slack, Discord, or generic webhook
- Backup & Restore โ One-command Docker volume backup with compose + env files
- Backup Drill โ Verify backups actually work by booting them in isolated containers
- MCP Server โ Works with Claude Desktop, ChatGPT, Cursor, and any MCP client
- Web Dashboard โ Beautiful dark-themed web UI with
homebutler serve - Watch & History โ Track restarts for Docker containers, systemd services, and PM2 apps; capture pre-death and post-restart logs; browse restart history (
homebutler watch) - TUI Dashboard โ Real-time terminal monitoring with
homebutler watch tui(btop-style) - Wake-on-LAN โ Power on machines remotely
- Port Scanner โ See what's listening and which process owns it
- Network Scan โ Discover devices on your LAN
- JSON Output โ Pipe-friendly, perfect for AI assistants to parse
๐ฆ One-Command App Install
homebutler install uptime-kumaโ Deploy self-hosted apps in seconds. Pre-checks Docker, ports, and duplicates. Generatesdocker-compose.ymlautomatically. See all available apps โ
Demo
๐ Web Dashboard
homebutler serveโ A real-time web dashboard embedded in the single binary viago:embed. Monitor all your servers, Docker containers, open ports, alerts, and Wake-on-LAN devices from any browser. Dark theme, auto-refresh every 5 seconds, fully responsive.
โจ Web Dashboard Highlights
- Server Overview โ See all servers at a glance with color-coded status (green = online, red = offline)
- System Metrics โ CPU, memory, disk usage with progress bars and color thresholds
- Docker Containers โ Running/stopped status with friendly labels ("Running ยท 4d", "Stopped ยท 6h ago")
- Top Processes โ Top processes sorted by CPU/memory with zombie detection
- Resource Warnings โ Visual CPU, memory, and disk thresholds in the dashboard
- Network Ports โ Open ports with process names and bind addresses
- Wake-on-LAN โ One-click wake buttons for configured devices
- Server Switching โ Dropdown to switch between local and remote servers
- Zero dependencies โ No Node.js runtime needed. Frontend is compiled into the Go binary at build time
homebutler serve # Start on port 8080 homebutler serve --port 3000 # Custom port homebutler serve --demo # Demo mode with realistic sample data
๐ Process Restart Watch
Your container crashed at 3 AM โ but why? homebutler watch catches it the moment it happens, saves the dying logs, figures out the cause, and tells you if it's happening over and over.
Supported backends: Docker (real-time event stream) ยท systemd (polling) ยท PM2 (polling)
Step 1: Add targets to watch
homebutler watch add nginx # Interactive: choose Docker / systemd / PM2 homebutler watch add --kind docker nginx # or specify directly homebutler watch add --kind systemd nginx.service homebutler watch add --kind pm2 my-api homebutler watch list # See what you're watching
Step 2: Start monitoring
homebutler watch start # Foreground, Ctrl+C to stop homebutler watch start --interval 10s # Custom poll interval (default 30s)
When a crash is detected, you'll see:
[03:14:22] INCIDENT: nginx (incident nginx-20260410-031422.581-7a2124)
Crash: OOM โ process killed by SIGKILL (oom, confidence: high)
โ FLAPPING: acute (3 restarts in short window)
Step 3: Investigate
homebutler watch history # List all incidents homebutler watch show <incident-id> # Full details
watch show output includes:
- Pre-death logs โ what the process printed right before it died
- Post-restart logs โ what happened after the restart
- Crash analysis โ category (oom / panic / segfault / timeout / dependency / error), reason, confidence level, matched log patterns
- Flapping status โ if the process is stuck in a crash loop
Crash Analysis
Every incident is automatically analyzed using exit codes and log patterns:
| Signal | Exit Code | Meaning |
|---|---|---|
| SIGKILL | 137 | OOM Killer or forced kill |
| SIGSEGV | 139 | Segmentation fault (memory corruption) |
| SIGTERM | 143 | Graceful shutdown request |
| โ | 1 | Application error |
| โ | 0 | Clean exit (may be intentional restart) |
Log patterns like panic:, Out of memory, Connection refused, FATAL, and timeout are matched automatically to help identify the root cause.
Flapping Detection
Detects when a process is stuck in a restart loop (e.g., crash โ restart โ crash again):
- Acute โ 3+ restarts within 10 minutes (something is broken right now)
- Chronic โ 5+ restarts within 24 hours (slow recurring issue)
Flapping incidents are tagged [FLAPPING] in history and highlighted in watch show.
Notifications (optional, off by default)
Notifications are disabled by default, which is useful for air-gapped or closed networks where everything runs locally.
A minimal example in ~/.config/homebutler/config.yaml:
notify: telegram: bot_token: "your-bot-token" chat_id: "your-chat-id" watch: enabled: true notify_on: flapping cooldown: 5m flapping: short_window: 10m short_threshold: 3 long_window: 24h long_threshold: 5 alerts: cpu: 90 memory: 85 disk: 90 rules: - name: cpu-spike metric: cpu threshold: 90 action: notify
Legacy ~/.homebutler/watch/config.json is still read as a fallback for watch-specific settings, and legacy alerts.yaml notify/webhook provider settings are still accepted for older setups.
watch.enabled: trueโ allow watch notificationswatch.notify_on: flappingโ notify only when repeated restart loops are detectedwatch.notify_on: incidentโ notify on every incidentwatch.notify_on: allโ notify on both incidents and flappingwatch.notify_on: offโ disable watch notifications without removing provider configwatch.cooldown: 5mโ suppress duplicate notifications for the same event fingerprint during the cooldown windowwatch.flappingโ optional advanced tuning for restart-loop detection
Manage targets
homebutler watch remove nginx # Stop watching homebutler watch check # One-shot check (no continuous monitoring)
๐ฅ๏ธ TUI Dashboard
homebutler watch tuiโ A terminal-based dashboard powered by Bubble Tea. Monitors all configured servers with real-time updates, color-coded resource bars, and Docker container status. No browser needed.
๐ง AI-Powered Management (MCP)
One natural language prompt manages your entire homelab. Claude Code calls homebutler MCP tools in parallel โ checking server status, listing Docker containers, and alerting on disk usage across multiple servers. See screenshots & setup โ
Quick Start
# One-line install (recommended, auto-detects OS/arch) curl -fsSL https://raw.githubusercontent.com/Higangssh/homebutler/main/install.sh | sh # Or via Homebrew brew install Higangssh/homebutler/homebutler # Or via npm (MCP server only) npm install -g homebutler # Interactive setup โ adds your servers in seconds homebutler init # Run homebutler status homebutler watch tui # TUI dashboard (all servers) homebutler watch start # Process restart monitor (Docker/systemd/PM2) homebutler serve # Web dashboard at http://localhost:8080 homebutler docker list homebutler wake desktop homebutler ports homebutler status --all # Install a self-hosted app (e.g. Uptime Kuma monitoring) homebutler install uptime-kuma
App Install
Deploy self-hosted apps with a single command. Each app runs via docker compose with automatic pre-checks, health verification, and clean lifecycle management.
# List available apps homebutler install list # Install (default port) homebutler install uptime-kuma # Install with custom port homebutler install uptime-kuma --port 8080 # Install jellyfin with media directory homebutler install jellyfin --media /mnt/movies # Check status homebutler install status uptime-kuma # Stop (data preserved) homebutler install uninstall uptime-kuma # Stop + delete everything homebutler install purge uptime-kuma
How it works
~/.homebutler/apps/
โโโ uptime-kuma/
โโโ docker-compose.yml โ auto-generated, editable
โโโ data/ โ persistent data (bind mount)
- Pre-checks โ Verifies docker is installed/running, port is available, no duplicate containers
- Compose-based โ Each app gets its own
docker-compose.ymlyou can inspect and customize - Data safety โ
uninstallstops containers but keeps your data;purgeremoves everything - Cross-platform โ Auto-detects docker socket (default, colima, podman)
Available apps
| App | Default Port | Description | Notes |
|---|---|---|---|
uptime-kuma |
3001 | Self-hosted monitoring tool | |
vaultwarden |
8080 | Bitwarden-compatible password manager | |
filebrowser |
8081 | Web-based file manager | |
it-tools |
8082 | Developer utilities (JSON, Base64, Hash, etc.) | |
gitea |
3002 | Lightweight self-hosted Git service | |
jellyfin |
8096 | Media system (movies, TV, music) | --media /path to mount media dir |
homepage |
3010 | Modern homelab dashboard | |
stirling-pdf |
8083 | All-in-one PDF tool (merge, split, convert, OCR) | |
speedtest-tracker |
8084 | Internet speed test with historical graphs | |
mealie |
9925 | Recipe manager and meal planner | |
pi-hole |
8088 | DNS ad blocking | |
adguard-home |
3000 | DNS ad blocker and privacy | |
portainer |
9443 | Docker management GUI | |
nginx-proxy-manager |
81 | Reverse proxy with SSL and web UI |
App-specific options
# Jellyfin: mount your media library homebutler install jellyfin --media /mnt/movies # Pi-hole / AdGuard: DNS ad blocking (port 53 required) homebutler install pi-hole # โ ๏ธ If port 53 is in use (Linux): sudo systemctl disable --now systemd-resolved # Portainer: Docker GUI (mounts docker socket) homebutler install portainer # Access via HTTPS: https://localhost:9443 # Nginx Proxy Manager: reverse proxy homebutler install nginx-proxy-manager # Default login: admin@example.com / changeme (change immediately!) # Any app: custom port homebutler install <app> --port 9999
Safety checks
- Port conflict detection โ Checks if the port is already in use before install
- DNS mutual exclusion โ Warns if pi-hole and adguard-home are both installed
- Docker socket warning โ Alerts when an app requires Docker socket access (portainer)
- OS-specific guidance โ Linux gets systemd-resolved fix, macOS gets lsof command
- Post-install tips โ DNS setup, HTTPS access, default credential warnings
Want more apps? Open an issue or see Contributing.
Usage
homebutler <command> [flags]
Commands:
status System status (CPU, memory, disk, uptime)
docker list List running containers
install <app> Install a self-hosted app (docker compose)
alerts Show current alert status
watch tui TUI dashboard (monitors all configured servers)
watch add/list/remove Manage watched containers
watch check/start One-shot or continuous restart detection
watch history/show Browse restart history
serve Web dashboard (browser-based, go:embed)
Flags:
--json JSON output (default: human-readable)
--server <name> Run on a specific remote server
--all Run on all configured servers in parallel
--port <number> Port for serve command (default: 8080)
--config <path> Config file (auto-detected, see Configuration)
Run homebutler --help for all commands.
๐ All Commands & Flags
Commands:
init Interactive setup wizard
status System status (CPU, memory, disk, uptime)
watch tui TUI dashboard (monitors all configured servers)
watch add <name> Add container to restart watch list
watch list Show watched containers
watch remove <name> Remove container from watch list
watch check One-shot restart check
watch start Continuous restart monitoring loop
watch history List restart history (alias: incidents)
watch show <id> Show restart details with logs
serve Web dashboard (browser-based, go:embed)
docker list List running containers
docker restart <n> Restart a container
docker stop <n> Stop a container
docker logs <n> Show container logs
wake <name> Send Wake-on-LAN packet
ports List open ports with process info
ps Show top processes (alias: processes)
ps --sort mem Sort by memory instead of CPU
ps --limit 20 Show top 20 (default: 10, 0 = all)
network scan Discover devices on LAN
alerts Show current alert status
alerts --watch Continuous monitoring with real-time alerts
trust <server> Register SSH host key (TOFU)
backup Backup Docker volumes, compose files, and env
backup list List existing backups
backup drill <app> Verify backup restores correctly (isolated)
backup drill --all Verify all apps in backup
restore <archive> Restore from a backup archive
upgrade Upgrade local + all remote servers to latest
deploy Install homebutler on remote servers
install <app> Install a self-hosted app (docker compose)
install list List available apps
install status <a> Check installed app status
install uninstall Stop app (keep data)
install purge Stop app + delete all data
mcp Start MCP server (JSON-RPC over stdio)
version Print version
Flags:
--json JSON output (default: human-readable)
--server <name> Run on a specific remote server
--all Run on all configured servers in parallel
--port <number> Port for serve command (default: 8080)
--demo Run serve with realistic demo data
--watch Continuous monitoring mode (alerts command)
--interval <dur> Watch interval, e.g. 30s, 1m (default: 30s)
--config <path> Config file (auto-detected, see Configuration)
--local Upgrade only the local binary (skip remote servers)
--local <path> Use local binary for deploy (air-gapped)
--service <name> Target a specific Docker service (backup/restore)
--to <path> Custom backup destination directory
--archive <path> Specific backup archive for drill
--all Verify all supported apps (backup drill)
๐ Web Dashboard
homebutler serve starts an embedded web dashboard โ no Node.js, no Docker, no extra dependencies.
homebutler serve # http://localhost:8080 homebutler serve --port 3000 # custom port homebutler serve --demo # demo mode with sample data
Monitoring
homebutler watch is the main monitoring workflow. It focuses on restart detection, crash analysis, flapping detection, and incident history.
# Target management homebutler watch add nginx # interactive kind selection homebutler watch add --kind docker nginx # explicit kind homebutler watch list # show watched targets homebutler watch remove nginx # remove a target # Monitoring homebutler watch start # start continuous crash/restart monitoring homebutler watch start --interval 10s # custom poll interval for polling-based backends homebutler watch check # one-shot restart check # Investigation homebutler watch history # incident history homebutler watch show <incident-id> # incident details + logs homebutler watch tui # TUI dashboard # Notifications homebutler notify test # test configured notification providers
If you only learn one monitoring workflow in homebutler, learn watch first.
Backup & Restore
One-command Docker backup โ volumes, compose files, and env variables.
homebutler backup # backup everything homebutler backup --service jellyfin # specific service homebutler backup --to /mnt/nas/backups/ # custom destination homebutler backup list # list backups homebutler restore ./backup.tar.gz # restore
โ ๏ธ Database services should be paused before backup for data consistency.
๐ Full backup documentation โ โ how it works, archive structure, security notes.
Alert Thresholds (Advanced)
alerts still exists for CPU, memory, and disk threshold checks, but it is an advanced flow and not the recommended first step for new users.
homebutler alerts --watch # default: 30s interval homebutler alerts --watch --interval 10s # check every 10 seconds homebutler alerts history # view alert history homebutler notify test # test your notification channels
Default thresholds: CPU 90%, Memory 85%, Disk 90%. Start with watch, then add alerts only if you specifically want threshold-based checks.
๐ Backup Drill
"Having a backup" and "being able to restore" are different things.
Backup Drill boots your backup in an isolated Docker environment and verifies the app actually responds โ like a fire drill for your data.
homebutler backup drill uptime-kuma # verify one app homebutler backup drill --all # verify all apps homebutler backup drill --json # machine-readable output homebutler backup drill --archive ./file # use a specific backup
What happens:
- Finds the latest backup archive
- Verifies archive integrity (
tarvalidation) - Creates an isolated Docker network + random port
- Boots the app from backup data
- Runs an HTTP health check
- Reports pass/fail and cleans up everything
๐ Backup Drill โ uptime-kuma
๐ฆ Backup: ~/.homebutler/backups/backup_2026-04-04_1711.tar.gz
๐ Size: 18.6 MB
๐ Integrity: โ
tar valid (8 files)
๐ Boot: โ
container started in 0s
๐ Health: โ
HTTP 200 on port 58574
โฑ๏ธ Total: 2s
โ
DRILL PASSED
Zero risk โ runs in a completely isolated environment. Your running services are never touched.
Supports health checks for: nginx-proxy-manager, vaultwarden, uptime-kuma, pi-hole, gitea, jellyfin, plex, portainer, homepage, adguard-home.
Configuration
homebutler init # interactive setup wizard๐ Configuration details โ โ config file locations, watch/notify options, and advanced alert thresholds.
Multi-server
Manage multiple servers from a single machine over SSH.
homebutler status --server rpi # query specific server homebutler status --all # query all in parallel homebutler deploy --server rpi # install on remote server homebutler upgrade # upgrade all servers
๐ Multi-server setup โ โ SSH auth, config examples, deploy & upgrade.
MCP Server
Built-in MCP server โ manage your homelab from any AI tool with natural language.
{
"mcpServers": {
"homebutler": {
"command": "npx",
"args": ["-y", "homebutler@latest"]
}
}
}Works with Claude Desktop, ChatGPT, Cursor, Windsurf, and any MCP client.
๐ MCP server setup โ โ supported clients, available tools, agent skills.
Installation
Homebrew (Recommended)
brew install Higangssh/homebutler/homebutler
Automatically installs to PATH. Works on macOS and Linux.
One-line Install
curl -fsSL https://raw.githubusercontent.com/Higangssh/homebutler/main/install.sh | shAuto-detects OS/architecture, downloads the latest release, and installs to PATH.
npm (MCP server)
npm install -g homebutler
Downloads the Go binary automatically. Use npx -y homebutler@latest to run without installing globally.
Go Install
go install github.com/Higangssh/homebutler@latest
Build from Source
git clone https://github.com/Higangssh/homebutler.git
cd homebutler
make buildUninstall
rm $(which homebutler) # Remove binary rm -rf ~/.config/homebutler # Remove config (optional)
Architecture
Goal: Engineers manage servers from chat โ not SSH.
Alert fires โ AI diagnoses โ AI fixes โ you get a summary on your phone.
homebutler is the tool layer in an AI ChatOps stack. It doesn't care what's above it โ use any chat platform, any AI agent, or just your terminal.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 3 โ Chat Interface โ
โ Telegram ยท Slack ยท Discord ยท Terminal ยท Browser โ
โ (Your choice โ homebutler doesn't touch this) โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 2 โ AI Agent โ
โ OpenClaw ยท LangChain ยท n8n ยท Claude Desktop โ
โ (Understands intent โ calls the right tool) โ
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CLI exec or MCP (stdio)
โโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 1 โ Tool (homebutler) โ YOU ARE HERE โ
โ โ
โ โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ โ
โ โ CLI โ โ MCP โ โ Web โ โ
โ โ stdout โ โ stdio โ โ :8080 โ โ
โ โโโโโโฌโโโโโ โโโโโโฌโโโโโ โโโโโโฌโโโโโ โ
โ โโโโโโโโโโโโโโผโโโโโโโโโโโโโ โ
โ โผ โ
โ internal/* โ
โ system ยท docker ยท ports ยท network โ
โ wake ยท alerts ยท remote (SSH) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Three interfaces, one core:
| Interface | Transport | Use case |
|---|---|---|
| CLI | Shell stdout/stderr | Terminal, scripts, AI agents via exec |
| MCP | JSON-RPC over stdio | Claude Desktop, ChatGPT, Cursor, any MCP client |
| Web | HTTP (go:embed) |
Browser dashboard, on-demand with homebutler serve |
All three call the same internal/ packages โ no code duplication.
homebutler is Layer 1. Swap Layer 2 and 3 to fit your stack:
- Terminal only โ
homebutler status(no agent needed) - Claude Desktop โ MCP server, Claude calls tools directly
- OpenClaw + Telegram โ Agent runs CLI commands from chat
- Custom Python bot โ
subprocess.run(["homebutler", "status", "--json"]) - n8n / Dify โ Execute node calling homebutler CLI
No ports opened by default. CLI and MCP use stdin/stdout only. The web dashboard is opt-in (homebutler serve, binds 127.0.0.1).
Now: CLI + MCP + Web dashboard โ you ask, it answers.
Goal: Full AI ChatOps โ infrastructure that manages itself.
Contributing
Contributions welcome! Please open an issue first to discuss what you'd like to change.



