GitHub - nakagami/grdpwasm
We believe that this document is fully human-written.
Hacker News Article AI Analysis
Content Label
Human
AI Generated
0%
Human
100%
Window 1 - Human
A web-based RDP client built with Go WebAssembly and grdp.
Connect to a Windows Remote Desktop server directly from your browser — no plugins required.
Architecture
Browser (WASM) ──WebSocket──► proxy (Go) ──TCP──► RDP Server
Because browsers cannot open raw TCP sockets, a lightweight Go proxy server bridges
WebSocket connections from the browser to the RDP server's TCP port.
Requirements
Go 1.24 or later
A reachable RDP server (Windows or any RDP-compatible host)
Build
git clone https://github.com/nakagami/grdpwasm.git
cd grdpwasm
make all
make all produces:
Output
Description
static/main.wasm
Go WASM binary (runs in the browser)
static/wasm_exec.js
Go runtime JS support file
proxy/proxy
WebSocket-to-TCP proxy + static file server
Run
make serve
# or equivalently:
./proxy/proxy -listen :8080 -static static
Then open http://localhost:8080 in your browser.
Proxy options
Flag
Default
Description
-listen
:8080
Address and port to listen on
-static
static
Directory to serve static files from
Usage
Open http://localhost:8080 in a browser.
Fill in the connection form:
Host — hostname or IP address of the RDP server
Port — RDP port (default 3389)
Domain — Windows domain (leave blank for local accounts)
User — username
Password — password
Width / Height — initial desktop resolution
Click Connect.
The remote desktop appears in the canvas. Click the canvas to capture keyboard focus.
Click Disconnect to end the session.
Keyboard & Mouse
All standard keyboard input is forwarded to the remote desktop via RDP scan codes.
Mouse move, button clicks, and scroll wheel are fully supported.
Note: The browser tab must have focus for keyboard events to be forwarded.
Click inside the canvas area if keys stop responding.
Audio
Remote audio is streamed via RDPSND and played through the browser's Web Audio API
(PCM 44100 Hz, stereo, 16-bit signed little-endian).
Security notes
The proxy accepts connections from any origin.
Window 2 - Human
Run it only on a trusted network
or add authentication before exposing it to the internet.
Credentials are transmitted from the browser to the proxy over WebSocket.
Use HTTPS/WSS (put the proxy behind a TLS-terminating reverse proxy such as
nginx or Caddy) when accessing it over an untrusted network.
Development
The repository contains a local fork of grdp under ./grdp/ with one addition:
a Dialer field on RdpClient that lets callers inject a custom net.Conn factory.
This is what allows the WASM build to connect via WebSocket instead of TCP.
make wasm # rebuild only the WASM binary
make proxy # rebuild only the proxy server
make wasm_exec # refresh wasm_exec.js from the local Go toolchain
make clean # remove all build artifacts
License
GPLv3 — see grdp LICENSE.