Native Linux client for macOS high-performance Screen Sharing (HEVC, clipboard, auto-resize)
Rust
5
72 commits
updated Oct 14, 2026
pippin brings macOS High-Performance Screen Sharing to Linux.
Normally reserved for Mac-to-Mac connections, Apple's high-performance mode delivers low-latency, color-accurate remote desktop sessions. pippin is a native Rust client that connects directly to your Mac's built-in screen sharing server—no third-party software required on macOS.
wgpu-supported GPU (Vulkan or OpenGL).5900 and 5901 open.libfdk-aac (pacman -S libfdk-aac, apt install libfdk-aac2, or dnf install fdk-aac). Without it, pippin runs silently.pippin (see below) and connect:pippin my-mac.local -u alice
Official AUR packages (pippin and pippin-git) are ready and will be published as soon as AUR account registration reopens. In the meantime, you can build and install the pacman package directly from the repository (which includes the desktop entry and icon):
git clone https://github.com/jonesy827/pippin
cd pippin/packaging/aur/pippin-git
makepkg -si
Building from source requires Rust 1.95 or newer (use rustup if your distro's package is older), along with clang, pkg-config, FFmpeg development headers, and ALSA:
# Debian 13 / Ubuntu 24.04
sudo apt install build-essential pkg-config clang libclang-dev libavcodec-dev libavutil-dev libasound2-dev
# Fedora
sudo dnf install gcc pkgconf-pkg-config clang clang-devel libavcodec-free-devel libavutil-free-devel alsa-lib-devel
Then install the binary via Cargo:
cargo install --locked --git https://github.com/jonesy827/pippin
Optional: cargo install only installs the binary. To launch pippin from your desktop application menu, install the .desktop entry and icon from a local checkout of this repository:
install -Dm644 assets/pippin.desktop ~/.local/share/applications/pippin.desktop
install -Dm644 assets/pippin.svg ~/.local/share/icons/hicolor/scalable/apps/pippin.svg
Unless --dialog is passed, pippin checks for your password in the following order:
--password <PASS> or the PIPPIN_PASSWORD environment variable--password-stdin# Example using pass
pass show mac | pippin my-mac.local -u alice --password-stdin
When prompted interactively, pippin offers to save your password to the desktop keyring. You can also pass --save-password to save it automatically, or --forget-password to remove an existing entry.
| Flag | Description |
|---|---|
--dialog | Always show the GUI connect dialog, even when run from a terminal or with a saved password. |
--session share|alt | Share the active user's screen (default), or log into a separate background session. |
--scale N | Set display scale. Defaults to 2 on HiDPI screens, 1 otherwise. |
--no-auto-resize | Keep the Mac's display resolution fixed instead of resizing with the window. |
--render-scale 0.5 | Stream at half resolution on a 2× display. Softens text slightly in exchange for a 75% bandwidth reduction. |
--decoder <TYPE> | Choose video decoder: auto (default), cuda, vaapi, or software. Use --vaapi-device to specify a render node. |
--after-loss idr|conceal | On packet loss, freeze until the next keyframe (idr, default) or continue with visual artifacts (conceal). |
--no-audio | Mute audio and instruct the Mac not to stream sound. |
--swap-ctrl-cmd | Map Ctrl to ⌘. By default, Super is ⌘ and Alt is ⌥. |
-v, -vv | Enable debug or trace logging (passwords and clipboard contents are never logged). |
macOS streams exclusively in HEVC 4:4:4, which requires specific hardware support:
vainfo for VAProfileHEVCMain444).pippin automatically falls back to CPU decoding, which works well at the cost of higher CPU usage.By default, pippin tries cuda → vaapi → software.
Apple's protocol does not retransmit dropped video packets—any lost packet stalls the video until a full keyframe arrives. Even 1% packet loss can freeze the display half the time. To smooth out unstable connections:
--render-scale 0.5 to shrink keyframe sizes and cut bandwidth usage.--after-loss conceal to keep the video moving through packet drops (the image will smear briefly until the next keyframe, rather than freezing).Switching to 4K can briefly backlog incoming video in the kernel (~670 KB) while the decoder initializes. If you experience dropped frames at 4K, raise Linux's maximum UDP receive buffer:
sudo sysctl -w net.core.rmem_max=8388608
pippin to IPv4 and one active session per client machine.Run the test suite with:
cargo test
src/interop_tests.rs verifies the protocol byte-for-byte against reference test vectors.--ignored by default as they require sample HEVC streams in PIPPIN_TEST_HEVC_DIR. You can generate these using FFmpeg (testsrc2 + libx265); see src/video/decoder.rs for expected filenames.--stats-json FILE to log per-second metrics (schema in src/session/metrics.rs).PIPPIN_CONTROL_FIFO=/tmp/pippin.ctl to adjust parameters on the fly (e.g., echo 'render_scale 0.5' > /tmp/pippin.ctl). Supported commands (render_scale, after_loss, hold, recovery, ltr, fps, keyframe, restart) are documented in src/session/operating.rs.packaging/aur/. After tagging a release, bump pkgver in packaging/aur/pippin/PKGBUILD, then run updpkgsums and makepkg --printsrcinfo > .SRCINFO before pushing to the AUR.pippin is an independent Rust implementation built on the protocol reverse-engineering work of iShareScreen.
Licensed under the AGPL-3.0-or-later. See LICENSE for details.
Native Linux client for macOS high-performance Screen Sharing (HEVC, clipboard, auto-resize)
Rust
5
72 commits
updated Oct 14, 2026
pippin brings macOS High-Performance Screen Sharing to Linux.
Normally reserved for Mac-to-Mac connections, Apple's high-performance mode delivers low-latency, color-accurate remote desktop sessions. pippin is a native Rust client that connects directly to your Mac's built-in screen sharing server—no third-party software required on macOS.
wgpu-supported GPU (Vulkan or OpenGL).5900 and 5901 open.libfdk-aac (pacman -S libfdk-aac, apt install libfdk-aac2, or dnf install fdk-aac). Without it, pippin runs silently.pippin (see below) and connect:pippin my-mac.local -u alice
Official AUR packages (pippin and pippin-git) are ready and will be published as soon as AUR account registration reopens. In the meantime, you can build and install the pacman package directly from the repository (which includes the desktop entry and icon):
git clone https://github.com/jonesy827/pippin
cd pippin/packaging/aur/pippin-git
makepkg -si
Building from source requires Rust 1.95 or newer (use rustup if your distro's package is older), along with clang, pkg-config, FFmpeg development headers, and ALSA:
# Debian 13 / Ubuntu 24.04
sudo apt install build-essential pkg-config clang libclang-dev libavcodec-dev libavutil-dev libasound2-dev
# Fedora
sudo dnf install gcc pkgconf-pkg-config clang clang-devel libavcodec-free-devel libavutil-free-devel alsa-lib-devel
Then install the binary via Cargo:
cargo install --locked --git https://github.com/jonesy827/pippin
Optional: cargo install only installs the binary. To launch pippin from your desktop application menu, install the .desktop entry and icon from a local checkout of this repository:
install -Dm644 assets/pippin.desktop ~/.local/share/applications/pippin.desktop
install -Dm644 assets/pippin.svg ~/.local/share/icons/hicolor/scalable/apps/pippin.svg
Unless --dialog is passed, pippin checks for your password in the following order:
--password <PASS> or the PIPPIN_PASSWORD environment variable--password-stdin# Example using pass
pass show mac | pippin my-mac.local -u alice --password-stdin
When prompted interactively, pippin offers to save your password to the desktop keyring. You can also pass --save-password to save it automatically, or --forget-password to remove an existing entry.
| Flag | Description |
|---|---|
--dialog | Always show the GUI connect dialog, even when run from a terminal or with a saved password. |
--session share|alt | Share the active user's screen (default), or log into a separate background session. |
--scale N | Set display scale. Defaults to 2 on HiDPI screens, 1 otherwise. |
--no-auto-resize | Keep the Mac's display resolution fixed instead of resizing with the window. |
--render-scale 0.5 | Stream at half resolution on a 2× display. Softens text slightly in exchange for a 75% bandwidth reduction. |
--decoder <TYPE> | Choose video decoder: auto (default), cuda, vaapi, or software. Use --vaapi-device to specify a render node. |
--after-loss idr|conceal | On packet loss, freeze until the next keyframe (idr, default) or continue with visual artifacts (conceal). |
--no-audio | Mute audio and instruct the Mac not to stream sound. |
--swap-ctrl-cmd | Map Ctrl to ⌘. By default, Super is ⌘ and Alt is ⌥. |
-v, -vv | Enable debug or trace logging (passwords and clipboard contents are never logged). |
macOS streams exclusively in HEVC 4:4:4, which requires specific hardware support:
vainfo for VAProfileHEVCMain444).pippin automatically falls back to CPU decoding, which works well at the cost of higher CPU usage.By default, pippin tries cuda → vaapi → software.
Apple's protocol does not retransmit dropped video packets—any lost packet stalls the video until a full keyframe arrives. Even 1% packet loss can freeze the display half the time. To smooth out unstable connections:
--render-scale 0.5 to shrink keyframe sizes and cut bandwidth usage.--after-loss conceal to keep the video moving through packet drops (the image will smear briefly until the next keyframe, rather than freezing).Switching to 4K can briefly backlog incoming video in the kernel (~670 KB) while the decoder initializes. If you experience dropped frames at 4K, raise Linux's maximum UDP receive buffer:
sudo sysctl -w net.core.rmem_max=8388608
pippin to IPv4 and one active session per client machine.Run the test suite with:
cargo test
src/interop_tests.rs verifies the protocol byte-for-byte against reference test vectors.--ignored by default as they require sample HEVC streams in PIPPIN_TEST_HEVC_DIR. You can generate these using FFmpeg (testsrc2 + libx265); see src/video/decoder.rs for expected filenames.--stats-json FILE to log per-second metrics (schema in src/session/metrics.rs).PIPPIN_CONTROL_FIFO=/tmp/pippin.ctl to adjust parameters on the fly (e.g., echo 'render_scale 0.5' > /tmp/pippin.ctl). Supported commands (render_scale, after_loss, hold, recovery, ltr, fps, keyframe, restart) are documented in src/session/operating.rs.packaging/aur/. After tagging a release, bump pkgver in packaging/aur/pippin/PKGBUILD, then run updpkgsums and makepkg --printsrcinfo > .SRCINFO before pushing to the AUR.pippin is an independent Rust implementation built on the protocol reverse-engineering work of iShareScreen.
Licensed under the AGPL-3.0-or-later. See LICENSE for details.