Terminal puts an xterm.js shell in the browser, proxied over a WebSocket to the root-privileged system agent. The consumer opens a Unix-domain-socket connection to the agent, starts a terminal.stream PTY session and relays keystrokes and output as base64 frames in both directions, forwarding window resizes so the remote shell knows its actual dimensions. The frontend supports multiple tabs, fullscreen, clearing, manual reconnect, and a mobile key bar for the keys a soft keyboard cannot send — Esc, Tab, Ctrl, ^C, arrows, pipe, tilde, slash — along with copy and paste buttons, since a phone has no Ctrl key.
Access requires either the P_TERMINAL permission or a hosting plan with SSH allowed, checked identically in the page view and the WebSocket consumer. Who the shell runs as is decided server-side: super-admins and Django superusers get a root shell, and everyone else runs as their own provisioned Linux user. A non-admin with no Linux user mapping is denied outright rather than falling through to an empty username, which the agent would treat as root. Session open and close are written to the vinza.agent.audit log with the panel user and the account the shell runs as, so a privileged shell is always attributable. This is a direct shell on the panel host through the agent, not an SSH client — it does not connect to other machines, and it depends entirely on the agent socket being reachable.
Use VinzaPanel's REST API to download and install this app programmatically.
POST /plugins/api/download/terminal/ Content-Type: application/json { "panel_version": "1.0.0" }
{
"success": true,
"plugin_id": "terminal",
"version": "1.0.3",
"download_url": "..."
}