panel

Launch a local operator panel for the assess → plan → verify loop. It binds to loopback only and never applies. The panel itself does not bill; a migrate it launches records the same billable-eligible migration usage event as the CLI, and verify does not meter.

vrtmv panel              # http://127.0.0.1:8766
vrtmv panel --port 9000
vrtmv panel --trust-host fleet.vrtmv.com --out /var/lib/vrtmv/fleet
FlagPurpose
--port <n>Port to bind on 127.0.0.1 (default 8766).
--trust-host <host>Accept one extra Host header besides localhost. Set only when the panel runs behind a trusted, authenticating reverse proxy — the panel still binds 127.0.0.1, so the proxy stays the only reachable front and the auth boundary. Omitted keeps the strict loopback-only guard.
--out <dir>Default fleet directory the read views use when a request carries no ?out=, so a hosted single-fleet dashboard shows its fleet without an out= in every URL. Omitted keeps the per-request behaviour.

As of v1.2.1 the panel serves the redesigned Fleet Management Console: one shared theme across its views, with a light / dark / auto toggle that remembers your choice. The views and their data are unchanged — only the presentation. Both new flags default off and are for running the console behind a trusted proxy; vrtmv panel --port N is unchanged, and the console stays read-only.

This is additive to ui, which remains the one-shot migrate client. The panel is the browser form of the console loop: assess a source, write a plan, verify a rebuild. After write-plan it shows the same apply instructions the console prints (ansible-playbook role path, vrtmv data for carry). Apply stays on run; the panel never runs it.

The server listens only on the loopback interface and rejects a non-local Host header, a cross-origin POST, a non-JSON Content-Type, and OPTIONS. It is intended for interactive use on the analysis host, not as a shared service.