webdesktopd is a browser-based Linux desktop for a single Unix user. It reuses SSH credentials for login, keeps terminal sessions alive across browser disconnects, and multiplexes terminal, file, and proxy traffic over one WebSocket.
- Real terminal tabs backed by PTYs, with reconnect and output replay
- File manager with directory listing, upload, download, rename, delete, and chmod
- Port proxy for local web apps under
/_proxy/{port}/... - Desktop shell with windows, docking, and saved UI state
- System stats panel for CPU, memory, disk, network, uptime, and processes
- SSH password or SSH key authentication against the local
sshd - Login form with
Remember mesupport that restores the username and secret from browser IndexedDB - Debian/Ubuntu
.deband Alpine.apkrelease packages
- Download the latest
.debor.apkfrom the GitHub Releases page. - Debian / Ubuntu:
sudo dpkg -i webdesktopd_*.deb
- Alpine:
sudo apk add ./webdesktopd-*.apk
- Set a strong
JWT_SECRETin/etc/webdesktopd/env. - Start the service:
- systemd:
sudo systemctl start webdesktopd - OpenRC:
sudo rc-service webdesktopd start
- systemd:
- Install Go 1.26+ and Bun.
- Build the frontend and backend:
make build
- Run locally:
JWT_SECRET=dev-secret ./webdesktopd- or
make run
make dev-backendstarts the Go server on:8080make dev-frontendstarts the Vite dev server on:5173make testruns Go unit testsmake e2eruns browser and server integration testsmake buildbuilds the frontend and backendmake deploy PASS=... REMOTE_USER=abbbuilds and deploys to the remote hostmake tunnel PASS=... REMOTE_USER=abbopens an SSH tunnel to the remote instance