⟩ Self-hosted AI ops
This is Vigilus.
Runs on your hardware, with your models, under your rules.
$ docker run -d \
--name vigilus \
-p 8000:8000 \
-e VIGILUS_SECRET="$(openssl rand -hex 32)" \
-v vigilus-data:/app/data \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
ghcr.io/vigilus-labs/vigilus:latest // Active operators
// Pending elevation
Restart nginx container after config update on prod-web-01
⟩ Why Vigilus
Plenty of AI tools will answer questions about your infrastructure. Vigilus is built to operate it. It connects over SSH, reads SIEM alerts, and manages containers through agents you define, with models you choose, on hardware you own.
Every write, execution, and elevation goes through your permission system. Reads stay available. Anything that changes state needs a scoped, time-limited token that you approve live or auto-approve with a log entry. Every action lands in an append-only audit log.
The point is not that AI can run your homelab. It is that you decide how far it can reach, and you can watch it work.
⟩ What it does
Operators you define
Give each sub-agent a system prompt, a model, a tool set, and a permission level. Vigilus routes work to the right Operator. You decide what each one can do.
Bring your own model
Anthropic, OpenAI, Google, Ollama, LM Studio, vLLM, OpenRouter, xAI, or any OpenAI-compatible endpoint. Pick a different model per Operator.
MCP-native
Run MCP servers on the host for nmap, WireGuard, filesystem, Wazuh, and more. Their tools are auto-discovered and assignable to Operators. Built in, not bolted on.
Real infrastructure reach
Pull Wazuh alerts, logs, and vulnerabilities. Run apt update and upgrade over SSH. Manage Docker containers and compose stacks. Act on the host itself.
Just-In-Time access
Reads are always available. Writes, exec, and elevation need a scoped, time-limited, signed token. Strict mode waits for approval. Lenient mode auto-approves and logs.
Audited by default
Every tool call, allowed or denied, lands in an append-only action log. Secrets stay encrypted at rest and never show up in the clear. No opt-in required.
⟩ Just-In-Time access
Reads stay on. Writes need a signed, time-limited token.
Every Operator action is classified by intent. Logs, status, and metrics stay available. Anything that writes, executes, or elevates privileges has to pass the JIT gate. The token is scoped to a specific resource, action, and time window.
Strict mode
Every elevation request waits in the dashboard. You see the Operator, the resource, the action, and a short description. Approve or deny. Nothing runs without you.
Lenient mode
Elevation requests are auto-approved and logged. Review them later in the action log. Useful for trusted Operators doing routine maintenance.
Pending elevation request
Run apt upgrade -y on prod-db-01
⟩ MCP-native
Install an MCP server. Its tools show up automatically.
MCP is part of the core product, not a plugin. Run servers on the host for network scans, VPN management, filesystems, and SIEM hooks. Vigilus discovers their tools and lets you assign them to any Operator.
⟩ What this is, and what it isn't
Vigilus is
- A self-hosted platform you run on your own hardware.
- An orchestrator that routes tasks to Operators you define.
- A permission system where you control what each Operator can reach.
- An audit log that records every action, allowed or denied.
- A config-first web dashboard. No CLI-only setup ritual.
It is not
- Not a hosted SaaS. There is no Vigilus cloud. Your box, your data.
- Not a walled garden. Bring your own models, MCP servers, and infrastructure.
- Not a substitute for knowing your own setup. It operates. You still design.
- Not a chatbot. It runs commands, reads logs, and manages containers.
⟩ Bring your own model
Any provider. Local or cloud. Per Operator.
Vigilus works with the major providers and any OpenAI-compatible endpoint, including models you host yourself. Give each Operator its own model: a local Llama for routine checks, Claude for harder reasoning, GPT-4o for security work.
⟩ Get started
One command on your hardware.
Read the docs, or run it and see.
$ docker run -d --name vigilus -p 8000:8000 -e VIGILUS_SECRET="$(openssl rand -hex 32)" -v vigilus-data:/app/data ghcr.io/vigilus-labs/vigilus:latest