Version 0.6.0

Low-latency desktop streaming between your computers

Ping, the client, and Pong, the host, stream a desktop at up to 4K and 120 fps with the latency of Moonlight and Apollo. Every packet travels in one post-quantum WireGuard tunnel. For macOS, Windows and Linux, and open source under the GPL-3.0.

Pong, the host: its Overview page, streaming to a MacBook Pro at 3024 by 1900 and 120 fps, with the session's live figures.
Ping, the client: its Hosts page, with one paired host, Pong, online.
Up to 4K
at 120 fps and more
HEVC and H.264
hardware encode and decode
Stereo to 7.1
Opus audio
ML-KEM-768
post-quantum, every packet
No port forwarding
NATs punched from both sides
macOS, Windows, Linux
client and host on each
Features

Feature for feature with Moonlight and Apollo

pingpong covers what a Moonlight + Apollo setup does, and adds to it: one code base in Rust, with a client and a host on all three desktops.

  • Post-quantum encryption

    Picture, sound, input and the clipboard travel in one tunnel: WireGuard with ML-KEM-768. Pairing is a hybrid SPAKE2 + ML-KEM exchange over a PIN. Encrypting a 1,200-byte packet takes 0.63 µs.

  • Reach your host from anywhere

    Hosts publish sealed records on the BitTorrent DHT, and both sides punch through their NATs. No relay server, no VPN and no ports to forward.

  • Recovery from packet loss

    Reed-Solomon parity, sized to the loss the link shows, rebuilds what Wi-Fi drops. When it cannot, Ping asks for a fresh reference frame, as Moonlight does.

  • Your screen’s exact mode

    Windows and macOS hosts create a virtual display at your screen’s resolution and refresh rate for the session, so nothing is scaled or letterboxed.

  • A clipboard shared both ways

    Text, images, files and folders, in either direction. Anything a password manager marks as concealed is never sent.

  • Surround sound and controllers

    Stereo, 5.1 or 7.1 sound. Controllers reach a Windows host as Xbox 360 pads, and rumble comes back about 7 ms after the host sets it.

Latency

The host’s screen and the client’s, side by side

A real stream from a Linux host to a Linux client, both screens recorded at the same instants. The host shows a running clock, so the two halves can be compared frame by frame: the client is one frame behind the host throughout. Ping’s statistics put 5.1 ms of that between the host capturing a frame and the client’s screen showing it, and no frame was lost.

Host · the screen Pong captures Client · Ping’s window

Where the 5.1 ms go

Host capture to client screen, averaged over 32 s
  • Host 2.63 ms capture, encode, encrypt, send
  • Network < 0.05 ms and reassembly; loopback here
  • Decode 0.46 ms the client’s decoder
  • Present 1.84 ms render, with V-Sync
  • Between 0.16 ms queues between stages

From Ping’s statistics: 1280×720 at 60 fps, H.264, encoded in software, host and client in one Linux container. On a real network, add its round trip. On the benchmark machines, capture to encoded frame takes 2.2–2.6 ms at 1080p60.

Performance

Measured against Moonlight + Apollo

The same MacBook, the same PC and the same demanding settings: 3024×1890 at 120 fps and 100 Mbit/s, HEVC, 7.1 sound, with the host’s screen full of noise.

Frames shown higher is better
pingpong
115.6 fps
Moonlight + Apollo
110.0 fps
Host processing lower is better
pingpong
5.0 ms
Moonlight + Apollo
5.6 ms
Decode lower is better
pingpong
1.6–2.0 ms
Moonlight + Apollo
2.32 ms

Client: a 14″ MacBook Pro (M4 Pro) on Wi-Fi. Host: Windows 11, RTX 3070 Ti, SudoVDA. Ping’s figures are 30-second averages; Moonlight’s, its end-of-stream statistics. The two measure network round trip differently, so it is left out here. Every figure, and how it was taken

AI agents

Let an AI agent use your host

An agent sees the screen and uses the keyboard and mouse the way you do through Ping: over the same tunnel, from anywhere. You can watch it, take over or stop it at any point.

An agent session in Ping: the conversation about the Downloads folder, the agent waiting for a go-ahead to empty the Recycle Bin with Allow and Don't buttons, the screen it saw after its last step, and its plan.
An agent session in Ping: the screen it saw after each step, its plan, and a go-ahead it waits for before it empties the Recycle Bin.
  • Watch it, or take over

    Every action, its result and the screen after it. Log in to see the desktop live; Ctrl Alt Shift T takes the keyboard and mouse.

  • It asks first

    Before it deletes, spends, sends, installs or types a password. Rules catch rm -rf, git push --force and DROP TABLE whether it asked or not.

  • Your model, or your agent

    Claude Code or Codex on your plan, an Anthropic, OpenAI or OpenRouter key, or a local model. Or give any MCP client your hosts as tools with Ping mcp.

Rules the host holds every agent to

  1. Never over a person An agent is refused while a person streams.
  2. A person always wins Starting a stream takes over from an agent.
  3. Secure screens are a person’s At a sign-in or lock screen, or a UAC prompt, its input is held.
  4. Someone at the host comes first Input at the host holds the agent until 10 s after it stops.

An agent pairs like a device, and its role is sealed with the PIN’s key: the host knows it by its key, not by what it claims. How agents work

The apps

Native apps for the client and the host

Ping runs on the computer you sit at, Pong on the one you stream from. Both are native windows drawn with GPUI, follow your system’s light or dark appearance, and explain every setting in a line.

Platforms

A client and a host on every desktop

System Client (Ping) Host (Pong)
macOS 14 and later Daily use

Ping.app

Works

Pong.app: a virtual display at your size, HEVC, stereo sound; no controllers

Windows 10 and 11 Works

Ping.exe, less tested than on macOS

Daily use

PongService: starts at boot and streams the lock screen; needs an NVIDIA GPU and SudoVDA

Linux X11 and Wayland Works

ping-app, tested in a container

Works

pong as a user service; the screen is scaled, with no virtual display

Phones, tablets and TVs are out of scope. Feature by feature against Moonlight + Apollo

Get started

Download, pair and stream

Say which computer this is for and what it runs, and you get its download.

Which computer is this for?
What does it run?

Ping for macOS

macOS 14 or later

  1. Open the zip and move Ping to Applications.
  2. Let macOS open it: Ping is signed but not notarized, so run the command below once, in Terminal.
  3. Open Ping, and let it find devices on your local network when it asks.
Once, in Terminal
xattr -dr com.apple.quarantine /Applications/Ping.app
Or all of it with Homebrew
brew tap mihaicristianfarcas/pingpong https://github.com/mihaicristianfarcas/pingpong
brew install --cask ping

Pong for macOS

macOS 14 or later

  1. Open the zip and move Pong and Pong Control to Applications.
  2. Let macOS open them: they are signed but not notarized, so run the command below once, in Terminal.
  3. Open Pong Control and choose Start Pong: the host then runs whenever you are logged in. Allow Screen Recording and Accessibility when macOS asks.
Once, in Terminal
xattr -dr com.apple.quarantine /Applications/Pong.app "/Applications/Pong Control.app"
Or all of it with Homebrew
brew tap mihaicristianfarcas/pingpong https://github.com/mihaicristianfarcas/pingpong
brew install --cask pong

Ping for Windows

Windows 10 or 11, 64-bit

  1. Extract the zip into a folder of its own: Ping.exe needs the DLLs beside it.
  2. Open Ping.exe. It is not signed, so SmartScreen asks first: choose More info, then Run anyway.
  3. Let Ping on private networks when Windows Firewall asks.

Pong for Windows

Windows 10 or 11, an NVIDIA GPU and SudoVDA

  1. Install SudoVDA, the virtual display driver, and a current NVIDIA driver: Pong encodes with NVENC. If Apollo is installed, it brought SudoVDA; stop its service while Pong runs.
  2. Extract the zip, double-click Install Pong.cmd and let it make changes. Pong then runs as a service from startup, before anyone signs in.
  3. Open Pong from the Start menu to see the host and pair devices.

Ping for Linux

Ubuntu 24.04 or a distribution built on it, x86_64

  1. Unpack it and run ./install.sh in its folder: Ping goes in ~/.local/bin and in your launcher.
  2. Open Ping from your launcher.
Or in a terminal
curl -L https://downloads.ping-pong.sh/latest/Ping-linux-x86_64.tar.gz | tar xz
Ping-*-linux-x86_64/install.sh

Pong for Linux

Ubuntu 24.04 or a distribution built on it, x86_64

  1. Unpack it and run ./install.sh in its folder: Pong runs as a user service in your desktop session, now and at each login.
  2. Under Wayland, let Pong share the screen when your desktop asks; on GNOME, switch on Allow Remote Interaction for the keyboard and mouse.
  3. Open Pong from your launcher to pair devices.
Or in a terminal
curl -L https://downloads.ping-pong.sh/latest/Pong-linux-x86_64.tar.gz | tar xz
Pong-*-linux-x86_64/install.sh

The newest build of the main branch. SHA-256 checksums All releases

  1. Install

    Pong on the computer you stream from, Ping on the one you sit at.

  2. Pair

    Click the host in Ping and type the PIN it shows into Pong. You do this once, on your network.

  3. Stream

    Click the host again, from anywhere. Ctrl+Alt+Shift+Q ends the stream.

Any of them builds from source with Rust 1.96 or newer. Installing, step by step