Twenty-one servers, one thing, once.

Pick the servers once and they are the working set. Run a line on all of them and read the answers side by side. Ask a question and get one value per box, grouped. Install what is missing only where it is missing. Or make the same change on every one — through the same door the server's own screen uses.

The Actions board in LockFlare Vigia: twenty-one servers as cards, each showing whether it is connected, its address, its group and what it is waiting on
Every server coloured by one thing — can Vigia reach it right now.
/ ONE PICK, ONE LINE

Eighteen boxes, eighteen answers.

Pick the servers once — one by one, a whole group, or a saved set — and they are the working set. A line goes out exactly as typed, as the login each box was opened with, and the answers land as they finish: one card per server, with the exit code and how long it took.

Before you press, each box's dot says whether Vigia can reach it right now, and every screen says how many picked boxes it skipped.

The pick is the working set

Pick Servers… opens a sheet with the map in it: tick servers one by one, a whole group with its own box, or load a saved set — a pick with a name, there tomorrow. The pick stands as a column on the right of the screen, a row per server under its group, each with a dot for the only thing that matters before you press anything: can Vigia reach that box right now. Green is a live shell. A spinner is a saved login being tried — a pick opens those by itself. Grey is a saved login waiting, and a click on the dot connects it; red is no login, or one that did not go through, and the click opens the login. Every screen that runs work says how many picked boxes it skipped rather than quietly leaving them out.

What can be done is the sidebar: Ask a question, Run a command, Install, Set up, and one search over all of it — type "user" and every row about users is there, whichever section it lives in. The same pick serves Snippets, Flows, Ask Themis and Overview, so the servers chosen for a question here are the ones a flow runs on next. Close All closes every shell on the pick and empties it.

Execute: one line, every answer side by side

Type a command, or pick one of the lines an operator types at a fleet most mornings — uptime and load, disk usage, memory, the busiest processes, failed services, the OS and kernel, listening ports, recent logins, who is on, whether a restart is needed, and, with sudo already in the line, recent errors or a package-list refresh. Your own snippets sit beside them. Picking one fills the box; it never runs on its own. What goes out is always in front of you before you press.

Answers land as they finish, one card per server, each with the exit code and how long it took; a box that hangs is cut off after two minutes and holds nobody else up. Rows that failed open by default, because those are the ones you came for. Nothing is merged into a single stream you would then have to untangle — eighteen boxes, eighteen answers, read as eighteen answers. And the line runs exactly as typed, as the login each box was opened with: sudo goes where you put it, and a box whose sudo wants a password says so in its row and runs nothing.

/ FIND OUT

Find out: the finding, not the output

Execute gives you text. Find out gives you an answer. Each of its questions has its own parser, so what comes back is one value per server — and then those values are grouped. Ask which CPU the fleet runs and you do not get eighteen paragraphs of lscpu: you get three groups, fifteen boxes on one processor, two on another, one on something else entirely. That is the finding. The odd one out is visible in a second instead of being scrolled past.

The catalog runs to nearly three hundred curated questions, folded into network, services, packages and OS, users and access, security posture, storage and load, hardware and host, CPU and memory now, kernel and tuning, web and apps, files and time, and the ones that need root — and the sidebar's search reaches every one of them. Anything a question needs, a port, a package name, a threshold, is asked above the button, and the raw output is always one click away for the box you want to look at properly. A group's head carries Keep only these open: the rest of the pick closes and leaves it, and the next thing is done on the boxes the answer found.

Beside it, the same kind of answer for the kernel each box runs.

# Find out · the kernel each box runs · 18 boxes # one value per server, then grouped 15 boxes 6.8.0-45-generic srv-01 srv-02 srv-03 srv-05 srv-06 … 2 boxes 6.8.0-40-generic srv-14 srv-15 1 box 5.15.0-119-generic # the odd one out srv-18 Keep only these open on each group's head the raw output, one click away, for the box you want

Install: only where it is missing

Pick the thing a server ought to have — Fail2Ban, ufw or firewalld, CrowdSec, ModSecurity, unattended upgrades, auditd, AIDE, debsums, the rootkit hunters, the AppArmor or SELinux tools, password quality, nginx, Apache, Caddy, PHP-FPM, certbot, ProFTPD, vsftpd, chrony and the rest — and every picked server is asked whether it already has it. Two lists come back: has it, and does not.

Then one button installs on all thirteen that lack it, or you install a single row. Each one is the same root job the server's own tab would run, watched here, and the box is asked again afterwards — so the row does not say "installed" because Vigia assumes it worked; it says it because the box said so.

Set up: the same change, everywhere, through the same door

This is the one that saves a morning. Add a user on every server, give or take sudo, add an SSH key, lock or unlock, delete, add a group, put someone in one, grant a folder, open or close a firewall port, turn the firewall on, set up Fail2Ban, harden sshd, run something as a service, turn on automatic updates, set the timezone, turn NTP on.

None of it is a second implementation. Each verb goes through the same code path the server's own screen uses, with the same refusals — the firewall never strips your SSH cover, sshd hardening is still proven by a fresh login. Twelve boxes are worked at a time, and a row per server says what happened on it, including the ones that asked for a sudo password.

The onboarding case is the whole point. One form creates the same account on eighteen machines with a shell, sudo, and a key — and if you choose "a key made here", Vigia generates the pair on your computer, gives the servers the public half, and asks you where to save the private one. That file is handed to the person and Vigia keeps no copy of it.

Security changes count as "the same change"

Opening a port on a fleet is where hand-rolled scripts go wrong, because the boxes do not agree: some run ufw, some firewalld, some have neither. Vigia reads each box first and speaks whatever it found — and refuses, on every one of them, to write a rule that would remove your own way in. Closing a port means unreachable, not unlisted: the allow rules go, a deny is added where the box lets everything in by default, and a box with no firewall on is refused in words rather than reported closed. Setting up Fail2Ban across the pick is the same story: one file per box, the package installed where it is missing, and each row reporting for itself.

/ SAFE AT TWENTY BOXES

What makes this safe to point at twenty boxes

It says what it skipped.

Every screen names the count it could not reach rather than quietly working on fewer servers than you think.

One implementation, not two.

Every verb here runs the same code as the server's own screen, with the same refusals. There is no "fleet version" that forgot a check.

Picking never runs.

A preset fills the command box. What is about to be sent is on screen before anything happens, and the button says how many servers it covers.

Exactly as typed.

A command runs as the login each box was opened with, word for word. Nothing adds or strips sudo; you type it where it belongs.

The box has the last word.

After an install or a change, the server is asked again. The row reports what the box says, not what Vigia hoped.

Sets are saved, not rebuilt.

Save a pick as a set with a name and it is there next week. A server can sit in as many sets as you have jobs.

When the same work happens every time

Draw it as a flow and run it on one server or on many — all at once, a few at a time, or one after the other.

Flows and the NOC