# Optional separate-VT launcher
Normal SSH/Zellij startup uses the player directly, as before:
```sh
cargo build --release
./target/release/medias \
--videos=Movies=/home/andy/tv/movies \
--videos=Series=/home/andy/tv/series \
--music=/home/andy/Music
```
This command does not require sudo for VT setup. It uses the caller's existing
DRM and input device permissions. The player owns a VT only when started from
a real Linux console; pseudo-terminals retain direct KMS operation.
Use the optional launcher when a separate managed VT is explicitly wanted:
```sh
./scripts/medias-vt \
--videos=Movies=/home/andy/tv/movies \
--videos=Series=/home/andy/tv/series \
--music=/home/andy/Music
```
The launcher requires Python 3.11+, `sudo`, `openvt` (package `kbd`), and
`setpriv` (package `util-linux`). It uses `sudo` to allocate a free VT and switch
the HDMI display to it. Medias runs as the invoking user, with the same groups,
working directory, and environment. For PipeWire, set `MEDIAS_AO=pipewire` before
the command. Normal DRM, input, audio, and CEC device permissions still apply.
Use the TV remote or a keyboard connected to the Pi. Ctrl-C in the launching
SSH/Zellij pane requests shutdown. Closing that pane also requests shutdown;
detaching Zellij keeps the session running. The launcher waits for medias cleanup
and `openvt` to return to the previous VT. It does not forcibly kill the player.
Logs append to `$XDG_STATE_HOME/medias/console.log`, or
`~/.local/state/medias/console.log` when `XDG_STATE_HOME` is unset. Use
`--log /path/to/log` to change it, or `--binary /path/to/medias` to select another
build. Other arguments are passed directly to medias.
Both launch paths use the existing DRM/KMS display backend. Neither creates a
desktop window. Real-console startup retains active-VT checks and restoration.
Hardware-free launcher checks:
```sh
python3 -m unittest discover -s scripts -v
```
These tests run fake media processes and use temporary Unix sockets. They do not
invoke `sudo` or `openvt`, access GPUs, or switch VTs.