Web Remote - UNITRONIX/BetterDesk GitHub Wiki
Web Remote Desktop
BetterDesk includes a browser-based remote desktop client accessible from the web console.
Overview
The web remote client connects to RustDesk peers directly from the browser, with no client installation needed. It supports:
| Feature | HTTPS | HTTP |
|---|---|---|
| Video codec | VP9, H.264, AV1, VP8 (WebCodecs) | H.264 only (JMuxer fallback) |
| Max FPS | 60 fps | 30 fps |
| Audio | ✅ Opus | ✅ Opus |
| Keyboard | ✅ Full (incl. modifiers, F-keys) | ✅ Full |
| Mouse | ✅ Click, right-click, scroll, drag | ✅ Click, right-click, scroll, drag |
| Clipboard | ✅ Bidirectional | ✅ Bidirectional |
| Session recording | ✅ WebM VP9+Opus | ✅ WebM VP9+Opus |
| Monitor switching | ✅ | ✅ |
| Quality presets | ✅ 4 presets | ✅ 4 presets |
Note: HTTPS is strongly recommended. WebCodecs API (VP9/AV1) is only available on secure origins. HTTP falls back to JMuxer (H.264 only) with lower performance.
Connecting
From the Devices Page
- Click the kebab menu (⋮) on a device row
- Select Connect
- Enter the device password
- The remote desktop opens in a new tab
Direct URL
http://your-server:5000/remote?id=DEVICE_ID
Controls
Toolbar
The remote desktop toolbar appears at the top:
| Button | Function |
|---|---|
| Quality | Switch between Speed / Balanced / Quality / Best presets |
| Monitor | Select which monitor to view (shows resolution) |
| Record | Start/stop session recording (downloads WebM on stop) |
| Fullscreen | Toggle fullscreen mode |
| Disconnect | End the remote session |
Keyboard Shortcuts
All standard keyboard shortcuts pass through to the remote machine, including:
- Modifier keys (Ctrl, Alt, Shift, Win/Meta)
- Function keys (F1-F12)
- Special keys (PrintScreen, Scroll Lock, Pause)
- Ctrl+Alt+Delete (when supported by the remote OS)
Mouse Input
| Action | Encoding |
|---|---|
| Left click | TYPE_DOWN | (BUTTON_LEFT << 3) |
| Right click | TYPE_DOWN | (BUTTON_RIGHT << 3) |
| Middle click | TYPE_DOWN | (BUTTON_MIDDLE << 3) |
| Scroll | TYPE_WHEEL | (direction << 3) |
| Move | Position sent as coordinates relative to canvas |
Quality Presets
| Preset | Image Quality | FPS | Use Case |
|---|---|---|---|
| Speed | Low | 30 | Slow connections, basic tasks |
| Balanced | Balanced | 30 | General use |
| Quality | Best | 30 | Detail work, design, reading |
| Best | Best | 60 | High-bandwidth, professional use |
Quality changes take effect immediately via Misc message to the peer.
Session Recording
Record sessions as WebM video (VP9 + Opus audio):
- Click Record in the toolbar (circle icon turns red)
- Perform your remote desktop tasks
- Click Record again to stop
- The recording downloads automatically as a
.webmfile
Recordings capture the canvas at 15 fps. Audio is included if active during the session.
Monitor Switching
For multi-monitor setups:
- Click the Monitor dropdown in the toolbar
- Select the desired display
- The view switches to the selected monitor
- Primary indicator shows which monitor is the default
Each monitor shows its resolution (e.g., Monitor 1 (1920×1080) ★).
Video Pipeline
HTTPS (WebCodecs)
Peer → H.264/VP9/AV1 frames → WebSocket → WebCodecs VideoDecoder → Canvas
- Negotiates codec via
VideoDecoder.isConfigSupported() - Supports VP9 (preferred), H.264, AV1, VP8
- Hardware acceleration when available
video_receivedACK sent before decode for optimal pipeline
HTTP (JMuxer Fallback)
Peer → H.264 frames → WebSocket → JMuxer → MSE → Video element → Canvas
- JMuxer converts raw H.264 NALUs to MP4 fragments
- MSE SourceBuffer trimmed at 2 seconds to prevent overflow
- Auto-seek when buffer latency exceeds 500ms
- Health check every 1000ms with stall recovery
Stall Recovery
If no frames arrive for 5 seconds, the client automatically requests a refreshVideo keyframe from the peer to resume the stream.
Technical Details
Connection Flow
- Client opens WebSocket to Node.js console (
/ws/remote/{id}) - Console proxies through Go server relay
- NaCl key exchange establishes encrypted channel
- Login message sent with password, codec preferences, FPS
- Peer responds with video/audio streams
Browser Requirements
| Browser | WebCodecs | JMuxer | Status |
|---|---|---|---|
| Chrome 94+ | ✅ | ✅ | Full support |
| Edge 94+ | ✅ | ✅ | Full support |
| Firefox 130+ | ✅ | ✅ | Full support |
| Safari 16.4+ | Partial | ✅ | H.264 only |
Known Limitations
- JMuxer (HTTP) is limited to H.264 at ~30 fps
- FileTransfer is not supported in web remote (use RustDesk desktop client)
- Audio quality depends on network bandwidth
- Some keyboard shortcuts may be intercepted by the browser (e.g., Ctrl+W)