Native Wayland & PipeWire Host for Google Chrome Remote Desktop on Hyprland
C++
0
14 commits
updated Sep 23, 2026
Native Wayland and PipeWire host for Google Chrome Remote Desktop on Hyprland.
hyprCRD provides native host support for Google Chrome Remote Desktop on the Hyprland Wayland compositor. It streams the active hardware-accelerated desktop session directly over WebRTC, avoiding virtual X11 framebuffers (Xvfb) and auxiliary display environments.
The official Chrome Remote Desktop host for Linux historically depended on virtual X11 display servers (Xvfb), isolating remote access to a detached fallback desktop. While upstream binaries contain experimental Wayland interfaces, they require org.freedesktop.portal.RemoteDesktop with Emulated Input System (libei) support—subsystems not provided by standard compositor backends.
hyprCRD supplies the necessary integration layer:
libremoting_core.so, chrome-remote-desktop-host), maintaining protocol compatibility with standard Android, iOS, and web clients.xdg-desktop-portal-hyprland for zero-copy DMA-BUF GPU capture with software SHM fallback.pam_shim.so) drops invalid dynamic format renegotiation requests when mobile or variable-geometry clients connect, avoiding capture stream interruption.hyprcrd-portal) implementing org.freedesktop.impl.portal.RemoteDesktop with libei/libeis, zwlr_virtual_pointer_v1, and zwp_virtual_keyboard_v1.systemd --user) without requiring elevated permissions or setuid binaries.flowchart TD
Client["Client Device (Android / iOS / Web)"] <-->|"WebRTC / Google FTL Signaling"| CRDHost["Google Remoting Host (chrome-remote-desktop-host)"]
subgraph hyprCRD ["hyprCRD User Session"]
CRDHost <-->|"D-Bus: org.freedesktop.impl.portal.RemoteDesktop"| Portal["hyprcrd-portal (C++20 Bridge)"]
CRDHost -->|"Preload Interceptor"| Shim["pam_shim.so (C99 Hook)"]
Shim -->|"Resolves cursor_mode & stream renegotiations"| PipeWire["PipeWire Media Server"]
Portal -->|"EIS Protocol (libei/libeis)"| InputServer["Virtual Input Controller"]
InputServer -->|"zwlr_virtual_pointer_v1"| HyprlandPointer["Hyprland Virtual Pointer"]
InputServer -->|"zwp_virtual_keyboard_v1 + XKB"| HyprlandKeyboard["Hyprland Virtual Keyboard"]
end
PipeWire <-->|"DMA-BUF / SHM Capture"| XDPH["xdg-desktop-portal-hyprland"]
XDPH <-->|"Wayland Screencopy"| HyprlandCompositor["Hyprland Compositor (Physical Output)"]
For technical details, see ARCHITECTURE.md.
| Capability | Legacy CRD (X11 / Xvfb) | Upstream Wayland | hyprCRD (Native Hyprland) |
|---|---|---|---|
| WebRTC Video Codecs (VP8, VP9, AV1) | Supported | Supported | Supported (Official Engine) |
| Google FTL & OAuth Signaling | Supported | Supported | Supported (Official Engine) |
| Active Compositor Desktop Access | No (Xvfb fallback) | No (Input unavailable) | Supported (Native Wayland) |
| PipeWire DMA-BUF 60 FPS Capture | No | Intermittent (Resize crashes) | Supported (Protected via shim) |
| Relative Pointer Motion | Supported | No | Supported (zwlr_virtual_pointer_v1) |
| Absolute Coordinate Mapping | Supported | No | Supported (Physical monitor scale) |
| Multi-Button Pointer Input | Supported | No | Supported (Primary, Secondary, Middle, Extra) |
| Continuous and Discrete Scrolling | Partial | No | Supported (Wheel notches and axis deltas) |
| System XKB Keymap and Modifiers | Basic US | No | Supported (Compositor keymap synthesis) |
| Mobile Client Overlays | Partial | No | Supported (Ctrl, Alt, Super, Function keys) |
| Unprivileged Execution | No (Requires PAM root) | No | Supported (systemd --user) |
| Automated Test Coverage | None | None | Comprehensive (95% line coverage) |
# Using paru
paru -S hyprcrd-git
# Using yay
yay -S hyprcrd-git
flatpak install flathub org.hyprland.hyprcrd
# Clone repository
git clone https://github.com/jxoesneon/hyprCRD.git
cd hyprCRD
# Install build dependencies (Arch Linux)
sudo pacman -S --needed base-devel cmake ninja sdbus-c++ libei libxkbcommon wayland wayland-protocols pipewire python python-psutil
# Build components
make all
# Download upstream Google binaries for local development
make fetch-google-deps
Verify environment configuration, library dependencies, and compositor sockets:
hyprcrd doctor
Generate an authorization token at remotedesktop.google.com/headless, copy the command string, and enroll the host:
hyprcrd enroll "<COMMAND_STRING>"
# Start the background daemon
hyprcrd start
# Run in foreground for debugging
hyprcrd start -f
# Check runtime status
hyprcrd status
# Stop daemon
hyprcrd stop
Example status output:
[hyprCRD Status]
Daemon: ACTIVE (PID: 3715)
Portal Bridge: ONLINE (PID: 1572)
Enrolled Host: workstation (ID: 855a3928-3500-4401-8b45-1a3206d55740)
For automatic startup on graphical login:
systemctl --user enable --now hyprcrd.service
To view service logs:
journalctl --user -u hyprcrd.service -f
The test harness evaluates the PAM preload shim, portal state logic, virtual input protocols, Python process management, and an isolated Wayland compositor session:
make test
gcov): Verifies PAM handle interception, PipeWire parameter protection, and D-Bus message translation.wayland-2) to verify input injection without touching active displays.hyprCRD follows an unprivileged security model:
chrome-remote-desktop PAM service.Please refer to CONTRIBUTING.md for development guidelines, coding style, and testing requirements.
chrome-remote-desktop-host, libremoting_core.so, icudtl.dat) are proprietary software of Google LLC and are retrieved from upstream packages during installation.14 commits
C++
45.2%
Python
28.1%
Shell
11.5%
C
10.7%
CMake
3.2%
Makefile
1.3%
Native Wayland & PipeWire Host for Google Chrome Remote Desktop on Hyprland
C++
0
14 commits
updated Sep 23, 2026
Native Wayland and PipeWire host for Google Chrome Remote Desktop on Hyprland.
hyprCRD provides native host support for Google Chrome Remote Desktop on the Hyprland Wayland compositor. It streams the active hardware-accelerated desktop session directly over WebRTC, avoiding virtual X11 framebuffers (Xvfb) and auxiliary display environments.
The official Chrome Remote Desktop host for Linux historically depended on virtual X11 display servers (Xvfb), isolating remote access to a detached fallback desktop. While upstream binaries contain experimental Wayland interfaces, they require org.freedesktop.portal.RemoteDesktop with Emulated Input System (libei) support—subsystems not provided by standard compositor backends.
hyprCRD supplies the necessary integration layer:
libremoting_core.so, chrome-remote-desktop-host), maintaining protocol compatibility with standard Android, iOS, and web clients.xdg-desktop-portal-hyprland for zero-copy DMA-BUF GPU capture with software SHM fallback.pam_shim.so) drops invalid dynamic format renegotiation requests when mobile or variable-geometry clients connect, avoiding capture stream interruption.hyprcrd-portal) implementing org.freedesktop.impl.portal.RemoteDesktop with libei/libeis, zwlr_virtual_pointer_v1, and zwp_virtual_keyboard_v1.systemd --user) without requiring elevated permissions or setuid binaries.flowchart TD
Client["Client Device (Android / iOS / Web)"] <-->|"WebRTC / Google FTL Signaling"| CRDHost["Google Remoting Host (chrome-remote-desktop-host)"]
subgraph hyprCRD ["hyprCRD User Session"]
CRDHost <-->|"D-Bus: org.freedesktop.impl.portal.RemoteDesktop"| Portal["hyprcrd-portal (C++20 Bridge)"]
CRDHost -->|"Preload Interceptor"| Shim["pam_shim.so (C99 Hook)"]
Shim -->|"Resolves cursor_mode & stream renegotiations"| PipeWire["PipeWire Media Server"]
Portal -->|"EIS Protocol (libei/libeis)"| InputServer["Virtual Input Controller"]
InputServer -->|"zwlr_virtual_pointer_v1"| HyprlandPointer["Hyprland Virtual Pointer"]
InputServer -->|"zwp_virtual_keyboard_v1 + XKB"| HyprlandKeyboard["Hyprland Virtual Keyboard"]
end
PipeWire <-->|"DMA-BUF / SHM Capture"| XDPH["xdg-desktop-portal-hyprland"]
XDPH <-->|"Wayland Screencopy"| HyprlandCompositor["Hyprland Compositor (Physical Output)"]
For technical details, see ARCHITECTURE.md.
| Capability | Legacy CRD (X11 / Xvfb) | Upstream Wayland | hyprCRD (Native Hyprland) |
|---|---|---|---|
| WebRTC Video Codecs (VP8, VP9, AV1) | Supported | Supported | Supported (Official Engine) |
| Google FTL & OAuth Signaling | Supported | Supported | Supported (Official Engine) |
| Active Compositor Desktop Access | No (Xvfb fallback) | No (Input unavailable) | Supported (Native Wayland) |
| PipeWire DMA-BUF 60 FPS Capture | No | Intermittent (Resize crashes) | Supported (Protected via shim) |
| Relative Pointer Motion | Supported | No | Supported (zwlr_virtual_pointer_v1) |
| Absolute Coordinate Mapping | Supported | No | Supported (Physical monitor scale) |
| Multi-Button Pointer Input | Supported | No | Supported (Primary, Secondary, Middle, Extra) |
| Continuous and Discrete Scrolling | Partial | No | Supported (Wheel notches and axis deltas) |
| System XKB Keymap and Modifiers | Basic US | No | Supported (Compositor keymap synthesis) |
| Mobile Client Overlays | Partial | No | Supported (Ctrl, Alt, Super, Function keys) |
| Unprivileged Execution | No (Requires PAM root) | No | Supported (systemd --user) |
| Automated Test Coverage | None | None | Comprehensive (95% line coverage) |
# Using paru
paru -S hyprcrd-git
# Using yay
yay -S hyprcrd-git
flatpak install flathub org.hyprland.hyprcrd
# Clone repository
git clone https://github.com/jxoesneon/hyprCRD.git
cd hyprCRD
# Install build dependencies (Arch Linux)
sudo pacman -S --needed base-devel cmake ninja sdbus-c++ libei libxkbcommon wayland wayland-protocols pipewire python python-psutil
# Build components
make all
# Download upstream Google binaries for local development
make fetch-google-deps
Verify environment configuration, library dependencies, and compositor sockets:
hyprcrd doctor
Generate an authorization token at remotedesktop.google.com/headless, copy the command string, and enroll the host:
hyprcrd enroll "<COMMAND_STRING>"
# Start the background daemon
hyprcrd start
# Run in foreground for debugging
hyprcrd start -f
# Check runtime status
hyprcrd status
# Stop daemon
hyprcrd stop
Example status output:
[hyprCRD Status]
Daemon: ACTIVE (PID: 3715)
Portal Bridge: ONLINE (PID: 1572)
Enrolled Host: workstation (ID: 855a3928-3500-4401-8b45-1a3206d55740)
For automatic startup on graphical login:
systemctl --user enable --now hyprcrd.service
To view service logs:
journalctl --user -u hyprcrd.service -f
The test harness evaluates the PAM preload shim, portal state logic, virtual input protocols, Python process management, and an isolated Wayland compositor session:
make test
gcov): Verifies PAM handle interception, PipeWire parameter protection, and D-Bus message translation.wayland-2) to verify input injection without touching active displays.hyprCRD follows an unprivileged security model:
chrome-remote-desktop PAM service.Please refer to CONTRIBUTING.md for development guidelines, coding style, and testing requirements.
chrome-remote-desktop-host, libremoting_core.so, icudtl.dat) are proprietary software of Google LLC and are retrieved from upstream packages during installation.14 commits
C++
45.2%
Python
28.1%
Shell
11.5%
C
10.7%
CMake
3.2%
Makefile
1.3%