No Java, no Tomcat
A single Rust binary in front of guacd, the same battle-tested protocol daemon Apache Guacamole uses. Install from a .deb, a Docker image or one script.
rustguac is a lightweight Rust replacement for the Apache Guacamole Java webapp. SSH, RDP, VNC, SPICE, Proxmox VE consoles, web browsing and VDI desktops through guacd, with OIDC sign-in, credentials kept in Vault and session recording built in.
No Java. No Tomcat. Single binary + guacd.
Architecture
rustguac replaces Guacamole's Java webapp and keeps guacd, the same C protocol daemon from guacamole-server. It proxies the Guacamole protocol over WebSockets and handles sign-in, session lifecycle, recording and VDI containers.
Session types
Everything guacd speaks, plus two session types Apache Guacamole doesn't have: a hardened Chromium on the server and a Linux desktop per user.
A browser terminal rendered by guacd's SSH plugin (xterm-256color), with file transfer straight to the target.
Windows and Linux desktops with auto-fit resize, from plain password logins to Kerberos and RemoteApp.
Connect to any VNC server: KVM and IPMI consoles, existing remote desktops and virtual machine displays.
Direct SPICE displays for libvirt and QEMU consoles.
VM consoles brokered through the Proxmox VE API, so only an API token is ever stored.
A real Chromium browser running headless on Xvnc on the server, streamed to the user's own browser.
Ephemeral Docker desktop containers, one per user, running xrdp and a Linux desktop. Bring your own image.
Highlights
Security-first defaults, credentials that never leave the server, and a deployment you can explain in one sentence.
A single Rust binary in front of guacd, the same battle-tested protocol daemon Apache Guacamole uses. Install from a .deb, a Docker image or one script.
SSH, RDP, VNC, SPICE, Proxmox VE consoles, headless Chromium web sessions and per-user Docker VDI desktops, all in the browser with no client software.
Connections and their secrets live in HashiCorp Vault or OpenBao KV v2. They are read server-side and never reach the browser.
Sign in with Authentik, Keycloak, Okta, Entra ID, Google or any OpenID Connect provider. OIDC groups map to admin, poweruser, operator and viewer.
Chain jump hosts to reach isolated networks for SSH, RDP, VNC, web and Proxmox sessions, with per-hop credentials kept in Vault.
Every session recorded in Guacamole format with an in-app player, disk rotation, one-click MP4 downloads and plain-text SSH typescripts.
TLS to the browser and to guacd, localhost-only CIDR allowlists out of the box, per-entry clipboard control, rate limiting and strict framing rules.
Opt-in RDP H.264 passthrough forwards the server's stream to WebCodecs instead of re-encoding every frame, with AVC444 for crisp text.
Screenshots
Pick a screen, or flip this site's theme: the screenshots follow, in rustguac's own aurora and light themes.
Security
Credentials stay in Vault and on the server. Network allowlists start at localhost. Both hops are encrypted. Then you open up exactly what you need.
# config.toml: which networks each protocol may reach.
# Every list defaults to localhost only (SSRF-safe).
ssh_allowed_networks = ["127.0.0.0/8", "::1/128", "198.51.100.0/24"]
rdp_allowed_networks = ["203.0.113.0/24"]
vnc_allowed_networks = ["127.0.0.0/8", "::1/128"]
web_allowed_networks = ["127.0.0.0/8", "::1/128"]
# Per-IP limits on the API, session creation and WebSockets
rate_limit = true
[tls]
cert_path = "/opt/rustguac/tls/cert.pem"
key_path = "/opt/rustguac/tls/key.pem"
# Set this and rustguac talks TLS to guacd as well
guacd_cert_path = "/opt/rustguac/tls/cert.pem"
Quickstart
Docker anywhere, a .deb for Debian 13 (amd64 and arm64), or build it all from source. guacd is bundled every way.
docker pull sol1/rustguac:latest
# Web sessions need the image's seccomp profile for Chromium's sandbox
docker run --rm --entrypoint cat sol1/rustguac:latest /opt/rustguac/seccomp-chromium.json > seccomp-chromium.json
docker run -d --name rustguac -p 8089:8089 --security-opt seccomp=seccomp-chromium.json sol1/rustguac:latest
# First start prints a one-time admin API key
docker logs rustguacServes HTTP on port 8089, so put a reverse proxy in front for HTTPS. Bind-mount config.toml to /opt/rustguac/config.toml to keep settings. For VDI, also mount /var/run/docker.sock and add the docker group.
# Download rustguac_*.deb (amd64 or arm64) from GitHub Releases
sudo apt install ./rustguac_*.deb
/opt/rustguac/bin/rustguac --config /opt/rustguac/config.toml add-admin --name admin
sudo systemctl enable --now rustguacInstalls to /opt/rustguac and starts both rustguac-guacd and rustguac. Save the printed API key: it is shown once. Edit /opt/rustguac/config.toml, then set up Vault or OpenBao for the Connections UI.
git clone https://github.com/sol1/rustguac.git
cd rustguac
sudo ./install.sh
/opt/rustguac/bin/rustguac --config /opt/rustguac/config.toml add-admin --name admin
sudo systemctl start rustguacFor Debian 13. Builds patched guacd and rustguac, creates the rustguac user, generates a self-signed certificate and installs systemd services. Use --no-tls to serve plain HTTP on port 8089, or --hostname=FQDN to name the certificate.
add-admin, or in the container logs on first start.contrib/vault-quickstart.sh sets one up in a single command.Not on Debian 13? Use the Docker image: the packaged guacd needs FreeRDP 3.15 or newer. See all install options.
Use cases
From a homelab with a Proxmox cluster to an MSP handing out access per customer.
Give each customer or team a folder shared with their OIDC groups or named users, keep everyone's credentials in Vault, sync devices from NetBox, and lend folder default credentials to new entries.
Replace jump-box logins with browser sessions through multi-hop SSH tunnels, with per-protocol allowlists, ephemeral SSH keys, clipboard control and Knocknoc gating at HAProxy.
Record every session, export MP4s for review, keep greppable SSH typescripts on a LUKS volume, and pull session history as CSV for auditors.
Open Proxmox VE VM consoles with a single API token, reach libvirt SPICE displays and IPMI/KVM VNC consoles, and install from one .deb or Docker image.
Hand out an isolated Linux desktop per user from your own Docker image, with persistent homes, resource limits and nothing to install on their machine.
Create sessions from your own backend with the REST API and send users to a single-use ticket URL, or lock a web session to one internal app with autofill.
Coming from Apache Guacamole?
Apache Guacamole is a mature, feature-rich platform. rustguac keeps its battle-tested protocol daemon and swaps the Java stack for one Rust binary with Vault, OIDC and more session types.
| Area | rustguac | Apache Guacamole |
|---|---|---|
| Web application runtime | Rust, single binary | Java (Tomcat + Guice + Jersey) |
| Protocol daemon | guacd from guacamole-server, bundled | guacd from guacamole-server |
| Connection credentials | Vault / OpenBao KV v2, server-side only | Database tables |
| User authentication | OIDC SSO, API keys, user API tokens | LDAP, RADIUS, TOTP, SAML, database |
| Web browser sessions | Headless Chromium on Xvnc, with autofill and domain allowlists | Not supported |
| VDI desktops | Ephemeral Docker container per user | Not supported |
| Maturity | Newer project; built and tested on Debian 13, Docker elsewhere | Mature, feature-rich platform |
FAQ
rustguac is a lightweight, open-source replacement for the Apache Guacamole Java web application, written in Rust. It gives you browser-based SSH, RDP, VNC, SPICE, Proxmox VE consoles, web browser sessions and Docker VDI desktops through guacd, the same protocol daemon Guacamole uses. It adds OIDC single sign-on, a four-tier role system, Vault-backed connection storage, multi-hop SSH tunnels and session recording. See the overview.
Not quite: rustguac replaces Guacamole's Java web application but keeps guacd and the Guacamole protocol, so your targets don't change while the management side does. Connections live in Vault or OpenBao instead of a SQL database, users sign in with OIDC instead of LDAP, RADIUS, TOTP, SAML or database accounts, and Guacamole user and group permissions are not carried over. The import-guacamole command brings across SSH, RDP and VNC connections from a MySQL/MariaDB dump. See rustguac vs Apache Guacamole.
You need HashiCorp Vault or OpenBao for the Connections UI, which is rustguac's main user-facing feature. Connection entries and credentials are stored in Vault or OpenBao KV v2 and read server-side. Without one, rustguac still runs, but users can only make ad-hoc connections, from Connect to a host beside the search box or through the API. The bundled contrib/vault-quickstart.sh sets up an existing server, a dev server or a local install in one command; see Vault quickstart.
Run docker run -d -p 8089:8089 sol1/rustguac:latest, then read the one-time admin API key from the container logs. The image bundles guacd, uses TLS between rustguac and guacd, and serves HTTP on port 8089, so put a reverse proxy in front for HTTPS. To keep your settings, bind-mount a config.toml to /opt/rustguac/config.toml. Web browser sessions also need the seccomp profile shipped in the image (--security-opt seccomp=seccomp-chromium.json), because Docker's default profile blocks Chromium's sandbox; see running under Docker. The installation guide has a Docker Compose example with volumes for data and recordings.
No. rustguac authenticates users with OIDC single sign-on, plus API keys and personal API tokens for automation. It has no LDAP, SAML, RADIUS or built-in TOTP login. If your directory or MFA lives behind an identity provider that speaks OIDC, such as Keycloak, Authentik, Okta or Entra ID, put rustguac behind that. Credential variables give a similar experience to Guacamole's LDAP credential passthrough without binding to LDAP.
Dump the guacamole_connection, guacamole_connection_parameter and guacamole_connection_group tables with mysqldump, then run rustguac import-guacamole --file guacamole-dump.sql --dry-run to preview and run it again without --dry-run to write to Vault. SSH, RDP (including RemoteApp) and VNC connections are imported, and connection groups become name prefixes. --map turns Guacamole's ${GUAC_USERNAME} tokens into rustguac credential variables. Users and permissions are not imported. See the migration guide.
Commercial support
24 hour commercial support available
rustguac is developed by Sol1, a Sydney IT company. Running it somewhere that matters? Have a chat with the team.
Open source
rustguac is developed by Sol1 and contributors on GitHub. Star the repo, report a bug, or send a pull request.