Skip to content

Setup & installation

Platform Support
Windows 10 / 11 Primary target.
Linux / X11 Secondary. Placement depends on the window manager.
Linux / Wayland Refused — the agent runs and serves the UI but will not arm commands.
macOS Development host only, never a deployment target.

Panes serves its web UI at https://127.0.0.1:31077 — loopback only, HTTPS on by default. No firewall rule is added; the UI is not reachable from other machines.

On first start Panes seeds one admin account (default email [email protected]) with a random 16-character password written to admin.password in the data dir (0600 on Linux). Sign-in forces a password change on first use — there is no fixed default password.

  • Windows: C:\ProgramData\Panes
  • Linux: /var/lib/panes

It holds the SQLite store (panes.db), the TLS cert/key (tls/), per-monitor Chromium profiles (profiles/), and daily-rolling logs (logs/panes.log). It is machine-level on purpose (not per-user).

The MSI installs to a fixed C:\Program Files\Panes (per-machine) and installs two binaries:

  • panes-agent.exe — the windowless background agent (run by the logon task).
  • panes.exe — a console CLI (--reset-admin, --install-logon-task, --uninstall-logon-task).

Instead of a Windows Service, Panes registers a Task Scheduler logon task named “Panes Agent” that runs in the interactive user session (a service would be stuck in Session 0 and unable to place windows). The task triggers ~10 seconds after logon to let the display churn settle, and never times out.

Updating is just installing a newer MSI over the old one — it force-closes the running agent first, so no reboot prompt.

Property Default Meaning
PANES_TASK_USER (empty) Pin the logon task to one account, so it fires only when that user logs on. Use for a kiosk autologon account: msiexec /i panes.msi PANES_TASK_USER=KIOSK01\signage. Empty = the task fires for whichever user logs on, in their own session.
PANES_RUNLEVEL leastprivilege Run level for the agent. highest requests elevation — but a standard MSI build rejects it by design (elevation is a separate signed build).

Inspect or run the task manually:

Terminal window
schtasks /Query /TN "Panes Agent" /V /FO LIST
schtasks /Run /TN "Panes Agent"

The .deb installs the panes binary to /usr/bin, a systemd user unit (panes.service, WantedBy=graphical-session.target), and an XDG autostart entry. State lives in /var/lib/panes owned by the panes group.

Terminal window
sudo apt install ./panes_*.deb
sudo usermod -aG panes "$USER" # write access to the data dir
systemctl --user enable --now panes.service

For a locked-down kiosk image, enable it for all users with systemctl --global enable panes.service.

In the default (auto) mode Panes generates a self-signed certificate with SANs for localhost, 127.0.0.1, and panes.local, and persists it under tls/ in the data dir.

On Windows the installer trusts it in the machine root store, so the browser loads the UI without a warning. On Linux/macOS the certificate is not added to any trust store, so the browser shows a one-time warning you accept for 127.0.0.1.

You can supply your own certificate with the PANES_TLS=manual mode plus PANES_TLS_CERT and PANES_TLS_KEY, or turn TLS off with PANES_TLS=off.

Accounts are local (passwords hashed with argon2id). Three roles:

  • Admin — everything, plus user management, config import, and the public-API allowlist.
  • Operator — edit monitors and commands, run/stop/apply.
  • Viewer — read-only.

You cannot delete the last admin or your own account. If you are locked out, recover from the host with panes --reset-admin, which writes a fresh password to admin.password.

The whole configuration exports and imports as a single JSON document — the seam for managing a fleet of machines. Import applies commands only; monitors are discovered hardware and are never imported. See the Public API for the endpoints.