{"slug": "show-hn-homebutler-a-cli-that-tells-you-what-changed-on-your-home-server", "title": "Show HN: HomeButler – A CLI that tells you what changed on your home server", "summary": "A new open-source Go binary called HomeButler provides homelab operators with a single CLI tool to monitor server health, track container changes, verify backups, and deploy self-hosted apps without requiring a daemon or database. The tool returns readable summaries and JSON output for terminal use, scripts, web dashboards, or AI agents, answering common questions like what is running, which container owns a port, and why a service restarted. HomeButler aims to solve the ongoing maintenance burden of self-hosting by offering structured, scriptable visibility into server operations without giving AI assistants full SSH access.", "body_md": "**Your tiny homelab butler.**\n\nA single Go binary for running a small home server without babysitting it.\n\nHomeButler helps you answer the boring but painful questions every homelab eventually creates:\n\n- What is running on my server right now?\n- Which container owns this port?\n- Why did this service restart at 3 AM?\n- Is my backup actually restorable?\n- Can I install this self-hosted app without hand-writing another compose file?\n- Can I let an AI assistant inspect my server without handing it a full SSH shell?\n\nNo daemon required. No database. No always-on web service. Just one Go binary you can use from the terminal, scripts, a web dashboard, or AI tools.\n\nThe design goal is simple: give humans and agents a narrow, structured interface to the server. HomeButler returns readable summaries and JSON instead of asking you to trust a black-box shell session.\n\n```\n# One-line install (auto-detects OS/arch)\ncurl -fsSL https://raw.githubusercontent.com/Higangssh/homebutler/main/install.sh | sh\n\n# Or via Homebrew\nbrew install Higangssh/homebutler/homebutler\n\n# Interactive setup — add your servers in seconds\nhomebutler init\n```\n\nUse it right away:\n\n```\nhomebutler status                    # CPU, memory, disk, uptime\nhomebutler docker list               # running containers\nhomebutler inventory scan            # containers + ports + topology\nhomebutler report                    # butler-style health report + change summary\nhomebutler install uptime-kuma       # deploy a self-hosted app\nhomebutler backup drill uptime-kuma  # verify a backup actually restores\nhomebutler watch tui                 # terminal dashboard\nhomebutler serve                     # web dashboard at http://localhost:8080\n```\n\nMachine-readable output is available everywhere:\n\n```\nhomebutler status --json\nhomebutler inventory scan --json\nhomebutler report --json\n```\n\n**Install apps**— deploy Uptime Kuma, Jellyfin, Pi-hole, Gitea, Portainer, and more with one command** Map your server**— see containers, exposed ports, system ports, and service topology** Run a doctor check**— diagnose resource pressure, stopped containers, public ports, backup hygiene, notifications, and report baseline readiness**Catch crashes**— save logs before/after Docker, systemd, or PM2 restarts and detect flapping loops** Verify backups**— boot backups in isolated containers before you trust them** Use it anywhere**— CLI, JSON, web dashboard, or MCP for AI agents without giving them SSH\n\nSelf-hosting is not hard because one `docker compose up`\n\nis hard. It is hard because the maintenance never ends: ports collide, containers restart silently, backups look fine until restore day, and every server becomes a slightly different snowflake.\n\nHomeButler is a small operations toolkit for that messy middle.\n\nThose are great dashboards. HomeButler is CLI-first, scriptable, JSON-friendly, air-gap friendly, and safe to copy onto any server. Use it when you want commands you can run from a terminal, cron job, SSH session, CI script, or AI agent — especially when you care more about “what changed?” than another graph.\n\n```\nhomebutler report\nhomebutler report --keep 7      # retain only the latest 7 snapshots\nhomebutler report --no-save     # preview without writing a snapshot\n```\n\n`report`\n\ngives you a concise butler-style summary of your homelab: current health, warnings, notable changes since the previous snapshot, and suggested next commands. On the first run, HomeButler creates a baseline under `~/.homebutler/reports/snapshots/`\n\n; later runs compare against the latest snapshot. Old snapshots are pruned automatically (`--keep 30`\n\nby default) so reports do not grow forever.\n\n```\nhomebutler doctor\nhomebutler doctor --strict          # non-zero exit if warnings/failures are found\nhomebutler doctor --json            # automation / MCP friendly\n```\n\n`doctor`\n\nis a read-only preflight for the problems homelab users usually discover too late: high disk or memory usage, stopped containers, public bind ports, stale or missing backups, missing notifications, and whether `report`\n\nhas a baseline for change detection.\n\n— Deploy self-hosted apps in seconds. Pre-checks Docker, ports, and duplicates. Generates`homebutler install uptime-kuma`\n\n`docker-compose.yml`\n\nautomatically.[See all available apps →]\n\n```\nhomebutler inventory scan\nhomebutler inventory export --format mermaid\nhomebutler --json inventory scan\n```\n\n`inventory scan`\n\ngives you a quick map of what is running on a server: system health, Docker containers, app ports, and system ports. Docker-published ports are connected back to the container that owns them, so local forwarding details like Colima/Lima stay understandable.\n\n```\n🏠 Home Network\n   Server  homelab (192.168.1.10)\n   Summary ✅ 1 running · ⚪ 1 stopped · 🌍 2 public ports · 🔒 4 local ports\n\n📦 Containers (2)\n   ├─ ⚪ vaultwarden · not started\n   │  └─ image vaultwarden/server:latest\n   └─ ✅ api-server · running\n      ├─ image my-api:latest\n      └─ exposes :8080 → 8080/tcp\n\n🌐 App Ports (1)\n   └─ 🌍 :8080/tcp · api-server\n```\n\nUse Mermaid export when you want a diagram for GitHub, Obsidian, docs, or an AI assistant:\n\n``` php\ngraph TD\n  home[\"🏠 Home Network\"] --> homelab[\"🖥 homelab<br/>192.168.1.10\"]\n  homelab --> c1[\"📦 api-server<br/>running\"]\n  homelab --> p1[\"🌍 :8080/tcp<br/>api-server\"]\n  c1 -. exposes .-> p1\n```\n\n— A real-time web dashboard embedded in the single binary via`homebutler serve`\n\n`go:embed`\n\n. 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.\n\n## ✨ Web Dashboard Highlights\n\n**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\n\n```\nhomebutler serve              # Start on port 8080\nhomebutler serve --port 3000  # Custom port\nhomebutler serve --demo       # Demo mode with realistic sample data\n```\n\nYour container crashed at 3 AM — but **why?** `homebutler watch`\n\ncatches it the moment it happens, saves the dying logs, figures out the cause, and tells you if it's happening over and over.\n\n**Supported backends:** Docker (real-time event stream) · systemd (polling) · PM2 (polling)\n\n```\nhomebutler watch add nginx              # Interactive: choose Docker / systemd / PM2\nhomebutler watch add --kind docker nginx          # or specify directly\nhomebutler watch add --kind systemd nginx.service\nhomebutler watch add --kind pm2 my-api\nhomebutler watch list                   # See what you're watching\nhomebutler watch start                  # Foreground, Ctrl+C to stop\nhomebutler watch start --interval 10s   # Custom poll interval (default 30s)\n```\n\nWhen a crash is detected, you'll see:\n\n```\n[03:14:22] INCIDENT: nginx (incident nginx-20260410-031422.581-7a2124)\n  Crash: OOM — process killed by SIGKILL (oom, confidence: high)\n  ⚠ FLAPPING: acute (3 restarts in short window)\nhomebutler watch history                # List all incidents\nhomebutler watch show <incident-id>     # Full details\n```\n\n`watch show`\n\noutput includes:\n\n**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\n\nEvery incident is automatically analyzed using exit codes and log patterns:\n\n| Signal | Exit Code | Meaning |\n|---|---|---|\n| SIGKILL | 137 | OOM Killer or forced kill |\n| SIGSEGV | 139 | Segmentation fault (memory corruption) |\n| SIGTERM | 143 | Graceful shutdown request |\n| — | 1 | Application error |\n| — | 0 | Clean exit (may be intentional restart) |\n\nLog patterns like `panic:`\n\n, `Out of memory`\n\n, `Connection refused`\n\n, `FATAL`\n\n, and `timeout`\n\nare matched automatically to help identify the root cause.\n\nDetects when a process is stuck in a restart loop (e.g., crash → restart → crash again):\n\n**Acute**— 3+ restarts within 10 minutes (something is broken right now)** Chronic**— 5+ restarts within 24 hours (slow recurring issue)\n\nFlapping incidents are tagged `[FLAPPING]`\n\nin history and highlighted in `watch show`\n\n.\n\nNotifications are disabled by default, which is useful for air-gapped or closed networks where everything runs locally.\n\nA minimal example in `~/.config/homebutler/config.yaml`\n\n:\n\n```\nnotify:\n  telegram:\n    bot_token: \"your-bot-token\"\n    chat_id: \"your-chat-id\"\n\nwatch:\n  enabled: true\n  notify_on: flapping\n  cooldown: 5m\n  flapping:\n    short_window: 10m\n    short_threshold: 3\n    long_window: 24h\n    long_threshold: 5\n\nalerts:\n  cpu: 90\n  memory: 85\n  disk: 90\n  rules:\n    - name: cpu-spike\n      metric: cpu\n      threshold: 90\n      action: notify\n```\n\nLegacy `~/.homebutler/watch/config.json`\n\nis still read as a fallback for watch-specific settings, and legacy `alerts.yaml`\n\nnotify/webhook provider settings are still accepted for older setups.\n\n`watch.enabled: true`\n\n— allow watch notifications`watch.notify_on: flapping`\n\n— notify only when repeated restart loops are detected`watch.notify_on: incident`\n\n— notify on every incident`watch.notify_on: all`\n\n— notify on both incidents and flapping`watch.notify_on: off`\n\n— disable watch notifications without removing provider config`watch.cooldown: 5m`\n\n— suppress duplicate notifications for the same event fingerprint during the cooldown window`watch.flapping`\n\n— optional advanced tuning for restart-loop detection\n\n```\nhomebutler watch remove nginx           # Stop watching\nhomebutler watch check                  # One-shot check (no continuous monitoring)\n```\n\n— 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.`homebutler watch tui`\n\nUse natural language when you want automation.MCP clients can call homebutler tools to check server status, list Docker containers, inspect ports, or run operational workflows.[See screenshots & setup →]\n\nDeploy self-hosted apps with a single command. Each app runs via **docker compose** with automatic pre-checks, health verification, and clean lifecycle management.\n\n```\n# List available apps\nhomebutler install list\n\n# Install (default port)\nhomebutler install uptime-kuma\n\n# Install with custom port\nhomebutler install uptime-kuma --port 8080\n\n# Install jellyfin with media directory\nhomebutler install jellyfin --media /mnt/movies\n\n# Check status\nhomebutler install status uptime-kuma\n\n# Stop (data preserved)\nhomebutler install uninstall uptime-kuma\n\n# Stop + delete everything\nhomebutler install purge uptime-kuma\n~/.homebutler/apps/\n  └── uptime-kuma/\n       ├── docker-compose.yml   ← auto-generated, editable\n       └── data/                ← persistent data (bind mount)\n```\n\n**Pre-checks**— Verifies docker is installed/running, port is available, no duplicate containers** Compose-based**— Each app gets its own`docker-compose.yml`\n\nyou can inspect and customize**Data safety**—`uninstall`\n\nstops containers but keeps your data;`purge`\n\nremoves everything**Cross-platform**— Auto-detects docker socket (default, colima, podman)\n\n| App | Default Port | Description | Notes |\n|---|---|---|---|\n`uptime-kuma` |\n3001 | Self-hosted monitoring tool | |\n`plex` |\n32400 | Plex Media Server | `--media /path` to mount media dir |\n`vaultwarden` |\n8080 | Bitwarden-compatible password manager | |\n`filebrowser` |\n8081 | Web-based file manager | |\n`it-tools` |\n8082 | Developer utilities (JSON, Base64, Hash, etc.) | |\n`gitea` |\n3002 | Lightweight self-hosted Git service | |\n`jellyfin` |\n8096 | Media system (movies, TV, music) | `--media /path` to mount media dir |\n`homepage` |\n3010 | Modern homelab dashboard | |\n`stirling-pdf` |\n8083 | All-in-one PDF tool (merge, split, convert, OCR) | |\n`speedtest-tracker` |\n8084 | Internet speed test with historical graphs | |\n`mealie` |\n9925 | Recipe manager and meal planner | |\n`pi-hole` |\n8088 | DNS ad blocking | |\n`adguard-home` |\n3000 | DNS ad blocker and privacy | |\n`portainer` |\n9443 | Docker management GUI | |\n`nginx-proxy-manager` |\n81 | Reverse proxy with SSL and web UI |\n\n```\n# Jellyfin: mount your media library\nhomebutler install jellyfin --media /mnt/movies\n\n# Pi-hole / AdGuard: DNS ad blocking (port 53 required)\nhomebutler install pi-hole\n# ⚠️ If port 53 is in use (Linux): sudo systemctl disable --now systemd-resolved\n\n# Portainer: Docker GUI (mounts docker socket)\nhomebutler install portainer\n# Access via HTTPS: https://localhost:9443\n\n# Nginx Proxy Manager: reverse proxy\nhomebutler install nginx-proxy-manager\n# Default login: admin@example.com / changeme (change immediately!)\n\n# Any app: custom port\nhomebutler install <app> --port 9999\n```\n\n**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\n\nWant more apps?\n\n[Open an issue]or see[Contributing].\n\n```\nhomebutler <command> [flags]\n\nCommands:\n  status              System status (CPU, memory, disk, uptime)\n  doctor              Diagnose health, exposure, backups, and readiness\n  docker list         List running containers\n  install <app>       Install a self-hosted app (docker compose)\n  alerts              Show current alert status\n  watch tui           TUI dashboard (monitors all configured servers)\n  watch add/list/remove  Manage watched containers\n  watch check/start   One-shot or continuous restart detection\n  watch history/show  Browse restart history\n  serve               Web dashboard (browser-based, go:embed)\n\nFlags:\n  --json              JSON output (default: human-readable)\n  --server <name>     Run on a specific remote server\n  --all               Run on all configured servers in parallel\n  --port <number>     Port for serve command (default: 8080)\n  --config <path>     Config file (auto-detected, see Configuration)\n```\n\nRun `homebutler --help`\n\nfor all commands.\n\n## 📋 All Commands & Flags\n\n```\nCommands:\n  init                Interactive setup wizard\n  status              System status (CPU, memory, disk, uptime)\n  doctor              Diagnose health, exposure, backups, and readiness\n  watch tui           TUI dashboard (monitors all configured servers)\n  watch add <name>    Add container to restart watch list\n  watch list          Show watched containers\n  watch remove <name> Remove container from watch list\n  watch check         One-shot restart check\n  watch start         Continuous restart monitoring loop\n  watch history       List restart history (alias: incidents)\n  watch show <id>     Show restart details with logs\n  serve               Web dashboard (browser-based, go:embed)\n  docker list         List running containers\n  docker restart <n>  Restart a container\n  docker stop <n>     Stop a container\n  docker logs <n>     Show container logs\n  wake <name>         Send Wake-on-LAN packet\n  ports               List open ports with process info\n  ps                  Show top processes (alias: processes)\n  ps --sort mem       Sort by memory instead of CPU\n  ps --limit 20       Show top 20 (default: 10, 0 = all)\n  network scan        Discover devices on LAN\n  alerts              Show current alert status\n  alerts --watch      Continuous monitoring with real-time alerts\n  trust <server>      Register SSH host key (TOFU)\n  backup              Backup Docker volumes, compose files, and env\n  backup list         List existing backups\n  backup drill <app>  Verify backup restores correctly (isolated)\n  backup drill --all  Verify all apps in backup\n  restore <archive>   Restore from a backup archive\n  upgrade             Upgrade local + all remote servers to latest\n  deploy              Install homebutler on remote servers\n  install <app>       Install a self-hosted app (docker compose)\n  install list        List available apps\n  install status <a>  Check installed app status\n  install uninstall   Stop app (keep data)\n  install purge       Stop app + delete all data\n  mcp                 Start MCP server (JSON-RPC over stdio)\n  version             Print version\n\nFlags:\n  --json              JSON output (default: human-readable)\n  --server <name>     Run on a specific remote server\n  --all               Run on all configured servers in parallel\n  --port <number>     Port for serve command (default: 8080)\n  --demo              Run serve with realistic demo data\n  --watch             Continuous monitoring mode (alerts command)\n  --interval <dur>    Watch interval, e.g. 30s, 1m (default: 30s)\n  --config <path>     Config file (auto-detected, see Configuration)\n  --local             Upgrade only the local binary (skip remote servers)\n  --local <path>      Use local binary for deploy (air-gapped)\n  --service <name>    Target a specific Docker service (backup/restore)\n  --to <path>         Custom backup destination directory\n  --archive <path>    Specific backup archive for drill\n  --all               Verify all supported apps (backup drill)\n```\n\n## 🌐 Web Dashboard\n\n`homebutler serve`\n\nstarts an embedded web dashboard — no Node.js, no Docker, no extra dependencies.\n\n```\nhomebutler serve                # http://localhost:8080\nhomebutler serve --port 3000    # custom port\nhomebutler serve --demo         # demo mode with sample data\n```\n\nOne-command Docker backup — volumes, compose files, and env variables.\n\n```\nhomebutler backup                          # backup everything\nhomebutler backup --service jellyfin       # specific service\nhomebutler backup --to /mnt/nas/backups/   # custom destination\nhomebutler backup list                     # list backups\nhomebutler restore ./backup.tar.gz         # restore\n```\n\n⚠️ Database services should be paused before backup for data consistency.\n\n📖 ** Full backup documentation →** — how it works, archive structure, security notes.\n\n`alerts`\n\nstill exists for CPU, memory, and disk threshold checks, but it is an advanced flow and not the recommended first step for new users.\n\n```\nhomebutler alerts --watch                  # default: 30s interval\nhomebutler alerts --watch --interval 10s   # check every 10 seconds\nhomebutler alerts history                  # view alert history\nhomebutler notify test                     # test your notification channels\n```\n\nDefault thresholds: CPU 90%, Memory 85%, Disk 90%. Start with `watch`\n\n, then add `alerts`\n\nonly if you specifically want threshold-based checks.\n\n**\"Having a backup\" and \"being able to restore\" are different things.**\n\nBackup Drill boots your backup in an isolated Docker environment and verifies the app actually responds — like a fire drill for your data.\n\n```\nhomebutler backup drill uptime-kuma        # verify one app\nhomebutler backup drill --all              # verify all apps\nhomebutler backup drill --json             # machine-readable output\nhomebutler backup drill --archive ./file   # use a specific backup\n```\n\n**What happens:**\n\n- Finds the latest backup archive\n- Verifies archive integrity (\n`tar`\n\nvalidation) - Creates an isolated Docker network + random port\n- Boots the app from backup data\n- Runs an HTTP health check\n- Reports pass/fail and cleans up everything\n\n```\n🔍 Backup Drill — uptime-kuma\n\n  📦 Backup: ~/.homebutler/backups/backup_2026-04-04_1711.tar.gz\n  📏 Size: 18.6 MB\n  🔐 Integrity: ✅ tar valid (8 files)\n\n  🚀 Boot: ✅ container started in 0s\n  🌐 Health: ✅ HTTP 200 on port 58574\n  ⏱️  Total: 2s\n\n  ✅ DRILL PASSED\n```\n\n**Zero risk** — runs in a completely isolated environment. Your running services are never touched.\n\nSupports health checks for: `nginx-proxy-manager`\n\n, `vaultwarden`\n\n, `uptime-kuma`\n\n, `pi-hole`\n\n, `gitea`\n\n, `jellyfin`\n\n, `plex`\n\n, `portainer`\n\n, `homepage`\n\n, `adguard-home`\n\n.\n\n```\nhomebutler init    # interactive setup wizard\n```\n\n📖 ** Configuration details →** — config file locations, watch/notify options, and advanced alert thresholds.\n\nManage multiple servers from a single machine over SSH.\n\n```\nhomebutler status --server rpi     # query specific server\nhomebutler status --all            # query all in parallel\nhomebutler deploy --server rpi     # install on remote server\nhomebutler upgrade                 # upgrade all servers\n```\n\n📖 ** Multi-server setup →** — SSH auth, config examples, deploy & upgrade.\n\nBuilt-in [MCP](https://modelcontextprotocol.io/) server — manage your homelab from any AI tool with natural language.\n\n```\n{\n  \"mcpServers\": {\n    \"homebutler\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"homebutler@latest\"]\n    }\n  }\n}\n```\n\nWorks with Claude Desktop, ChatGPT, Cursor, Windsurf, and any MCP client.\n\n📖 ** MCP server setup →** — supported clients, available tools, agent skills.\n\n```\nbrew install Higangssh/homebutler/homebutler\n```\n\nAutomatically installs to PATH. Works on macOS and Linux.\n\n```\ncurl -fsSL https://raw.githubusercontent.com/Higangssh/homebutler/main/install.sh | sh\n```\n\nAuto-detects OS/architecture, downloads the latest release, and installs to PATH.\n\n```\nnpm install -g homebutler\n```\n\nDownloads the Go binary automatically. Use `npx -y homebutler@latest`\n\nto run without installing globally.\n\n```\ngo install github.com/Higangssh/homebutler@latest\ngit clone https://github.com/Higangssh/homebutler.git\ncd homebutler\nmake build\nrm $(which homebutler)           # Remove binary\nrm -rf ~/.config/homebutler      # Remove config (optional)\n```\n\nGoal: Engineers manage servers from chat — not SSH.Alert fires → AI diagnoses → AI fixes → you get a summary on your phone.\n\nhomebutler 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.\n\n```\n┌──────────────────────────────────────────────────┐\n│  Layer 3 — Chat Interface                        │\n│  Telegram · Slack · Discord · Terminal · Browser │\n│  (Your choice — homebutler doesn't touch this)   │\n└──────────────────────┬───────────────────────────┘\n                       │\n┌──────────────────────▼───────────────────────────┐\n│  Layer 2 — AI Agent                              │\n│  OpenClaw · LangChain · n8n · Claude Desktop     │\n│  (Understands intent → calls the right tool)     │\n└──────────────────────┬───────────────────────────┘\n                       │  CLI exec or MCP (stdio)\n┌──────────────────────▼───────────────────────────┐\n│  Layer 1 — Tool (homebutler)       ← YOU ARE HERE │\n│                                                   │\n│  ┌─────────┐  ┌─────────┐  ┌─────────┐           │\n│  │   CLI   │  │   MCP   │  │   Web   │           │\n│  │ stdout  │  │  stdio  │  │  :8080  │           │\n│  └────┬────┘  └────┬────┘  └────┬────┘           │\n│       └────────────┼────────────┘                 │\n│                    ▼                              │\n│             internal/*                            │\n│   system · docker · ports · network               │\n│   wake · alerts · remote (SSH)                    │\n└───────────────────────────────────────────────────┘\n```\n\n**Three interfaces, one core:**\n\n| Interface | Transport | Use case |\n|---|---|---|\nCLI |\nShell stdout/stderr | Terminal, scripts, AI agents via `exec` |\nMCP |\nJSON-RPC over stdio | Claude Desktop, ChatGPT, Cursor, any MCP client |\nWeb |\nHTTP (`go:embed` ) |\nBrowser dashboard, on-demand with `homebutler serve` |\n\nAll three call the same `internal/`\n\npackages — no code duplication.\n\n**homebutler is Layer 1.** Swap Layer 2 and 3 to fit your stack:\n\n**Terminal only**→`homebutler status`\n\n(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\"])`\n\n**n8n / Dify**→ Execute node calling homebutler CLI\n\n**No ports opened by default.** CLI and MCP use stdin/stdout only. The web dashboard is opt-in (`homebutler serve`\n\n, binds `127.0.0.1`\n\n).\n\n**Now:** CLI + MCP + Web dashboard — you ask, it answers.\n\n**Goal:** Full AI ChatOps — infrastructure that manages itself.\n\nContributions welcome! Please open an issue first to discuss what you'd like to change.", "url": "https://wpnews.pro/news/show-hn-homebutler-a-cli-that-tells-you-what-changed-on-your-home-server", "canonical_source": "https://github.com/Higangssh/homebutler", "published_at": "2026-06-04 11:31:32+00:00", "updated_at": "2026-06-04 11:48:58.232114+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "ai-infrastructure"], "entities": ["HomeButler", "Go", "Homebrew", "Higangssh", "Uptime Kuma"], "alternates": {"html": "https://wpnews.pro/news/show-hn-homebutler-a-cli-that-tells-you-what-changed-on-your-home-server", "markdown": "https://wpnews.pro/news/show-hn-homebutler-a-cli-that-tells-you-what-changed-on-your-home-server.md", "text": "https://wpnews.pro/news/show-hn-homebutler-a-cli-that-tells-you-what-changed-on-your-home-server.txt", "jsonld": "https://wpnews.pro/news/show-hn-homebutler-a-cli-that-tells-you-what-changed-on-your-home-server.jsonld"}}