Show HN: OpenRMM – open-source RMM where the AI proposes and a human approves OpenRMM, an open-source, self-hosted remote monitoring and management (RMM) platform, launched with a native AI assistant that proposes scripts and actions in plain language but requires human approval before anything runs on an endpoint. The project positions itself against closed-SaaS AI-copilot RMMs such as Atera, SuperOps, Acronis and Neo Agent by letting operators connect any OpenAI-compatible endpoint, including local models, so fleet data can stay on their own infrastructure. OpenRMM ships a single cross-platform Go agent for Windows, Linux and macOS, an MCP server with OAuth 2.1 and scoped revocable tokens, and an append-only audit trail backed by triggers, a non-owner database role and a hash chain. An open-source, self-hosted RMM Remote Monitoring & Management with a native AI assistant : a modern console, a chat that connects to any AI model via API BYO-model, including local/private models , its own cross-platform agent, and pluggable remote access. Ask the assistant in plain language — "install 7-zip on the finance group" , "configure printer model X at IP Y on host Z" , "generate a report of offline devices" — and it inspects the fleet, proposes the scripts/actions, and a human approves before anything runs on an endpoint. Most AI-copilot RMMs Atera, SuperOps, Acronis, Neo Agent are closed SaaS : the fleet's data goes to the vendor's cloud and to the model the vendor picked. OpenRMM is an open-source, self-hosted RMM built around three choices: - Any model — any OpenAI-compatible endpoint, including a local one, so command data can stay on your own infrastructure. - A human approves every action — the AI reads and proposes; nothing runs on an endpoint until someone approves the job. - Privacy first — your server, your database, your audit trail. - Own Go agent — single cross-platform binary Windows/Linux/macOS , no runtime; self-updates from the server make agent-dist for development; signed, versioned release artifacts are required for production . - AI chat with tool-calling — the model reads fleet state and proposes actions. - Guardrails by design — AI never executes directly; every action is a job that a human approves, with dry-run preview and an append-only audit log. - Pluggable remote access — native built-in relay + media sidecar, tile-delta codec; Windows and Linux/Xorg including the login screen, and macOS; file transfer, chat with the user, clipboard both ways, display selection, Ctrl+Alt+Del on Windows, and a notice of who else is connected , terminal an elevated PTY/ConPTY shell in the browser, gated by devices.terminal , meshcentral , and rustdesk opens your own RustDesk client on the device's id, read on demand; off by default — all behind one interface. Swap freely. - BYO AI model — any OpenAI-compatible endpoint OpenAI, Ollama, vLLM, … . - Classic RMM, too — Client→Site→Agent hierarchy, RBAC users, script library, monitoring checks + alerts, scheduled tasks, and inherited policies. The agent installs as a system service and reports rich inventory. - Access control — built-in admin / tech / readonly roles plus custom roles, optional TOTP 2FA , single sign-on through any OpenID Connect provider with MFA requirements checked on the provider's signed claims , and per-user access scope Company/Site/Department/device enforced on read, write, remote access, and the AI/MCP surface. AI/MCP tools are filtered by the caller's permissions and scope. AI reports stay in chat with a client-side CSV download — never written to an endpoint. - The built-in readonly role is not purely observational: it includes devices.remote remote desktop , but not file transfer or terminal. Create a custom role without devices.remote when screen access is not acceptable. - MCP server — connect external AI Claude, ChatGPT, … to manage the fleet, reusing the same permission-filtered tools and the same human-approval guardrail. Secured with scoped revocable tokens + mcp.use + an IP allowlist, or with the built-in OAuth 2.1 server so cloud connectors sign in natively with an applications screen to approve and revoke them ; deploy privately Tailscale or behind TLS. - Alert email — per-user subscriptions, a durable outbox with retries, and your own SMTP relay or an operator's shared service, to confirmed addresses only . - Append-only audit trail — triggers, a non-owner database role and a hash chain; searchable, exportable as CSV, and queryable by the assistant. - Six languages — the console is fully translated into English, Portuguese Brazil , Spanish, German, Japanese and Simplified Chinese. bundled React UI ── REST/WS API ── AI chat tool-calling loop │ ┌─────────────┼──────────────┐ │ │ │ agent hub job queue remote relay WS Postgres native provider │ ┌────────┴─────────┐ │ Go agent endpoint │ + remote client native / MeshCentral └──────────────────┘ Full detail: docs/01-architecture.md https://github.com/openrmm-project/openrmm/blob/main/docs/01-architecture.md . Self-host with the published images. Use one Linux server, three DNS names and Docker Compose. Caddy obtains the certificates, and the release images come from ghcr.io/openrmm-project : git clone https://github.com/openrmm-project/openrmm.git && cd openrmm/deploy cp .env.example .env set the hostnames and the release key ops/provision-secrets.sh docker compose up -d deploy/QUICKSTART.md https://github.com/openrmm-project/openrmm/blob/main/deploy/QUICKSTART.md covers what to put in .env , the first administrator, adding devices and upgrades. The full runbook backups, point-in-time recovery, standby is deploy/README-production.md https://github.com/openrmm-project/openrmm/blob/main/deploy/README-production.md . Run from source development : cp .env.example .env replace RMM ADMIN TOKEN with a generated value docker compose up -d postgres + server or run locally: export RMM ADMIN TOKEN="$ openssl rand -hex 32 " make build && ./bin/rmm-server Create the first console user the console signs in with a password or SSO, not with the admin token : curl -X POST localhost:3005/api/auth/bootstrap \ -H "Authorization: Bearer $RMM ADMIN TOKEN" -H "Content-Type: application/json" \ -d '{"username":"admin","password":"<12+ characters, an uppercase letter and a symbol "}' Then enroll an agent: 1. create an enrollment token curl -X POST localhost:3005/api/enroll-tokens \ -H "Authorization: Bearer $RMM ADMIN TOKEN" -d '{"uses":1}' 2. enroll once, then start the long-lived agent without the bootstrap token ./bin/rmm-agent -server ws://localhost:3005/ws/agent -enroll-token