Self-hosted desktop stream
Stream your full screen anyone, anywhere with a link. your PC to the viewer, the server only trades the handshake.
Note: Works on localhost as-is. Hosting on a domain needs HTTPS (note that browsers refuse WebRTC on HTTP)
2026-09-19.01-16-12.mp4
- Copy the config and set the secret:
Copy-Item viewpoint.example.yaml viewpoint.yaml, then run$env:VIEWPOINT_JWT_SECRET = "replace-me-a-long-string" - Start the server:
go run ./server/cmd/viewpoint-server - Start the client:
cargo run --release --manifest-path client/Cargo.toml - Mint a link and open the
/v/...URL it returns:curl.exe -X POST -H "Authorization: Bearer $env:VIEWPOINT_JWT_SECRET" http://localhost:8080/api/links
Private links show everything on your screen. Only share links with people you trust.
- The stream link can handle multiple viewers. Each tab gets its own session, while the host sends the same encoded frames to everyone.
- Leave
turn_urlempty if you want pure P2P. If you setturn_urlandVIEWPOINT_TURN_SECRET, it’ll also work behind symmetric NATs - Your upload bandwidth gets used once per viewer, so this is fine for a few private viewers, but probably not a alot
- Always use the release client. Debug builds only encode at around 1 FPS, while release runs at full frame rate. If things are still laggy, try lowering
width,height,fps, orbitrate_kbpsinviewpoint.yaml, then restart the client - For a public domain, put HTTPS in front of it with something like Caddy, set
public_urlto your domain, and leavecontrol_urllocal
Download from Releases. once downloaded just configure viewpoint.yaml and run viewport-server.exe and viewport-client.exe
One command (builds both, packs dist/ + the zip):
powershell -ExecutionPolicy Bypass -File build.ps1Output: dist/viewpoint-server.exe + dist/viewpoint-client.exe + viewpoint-windows-amd64.zip. Run both with powershell -ExecutionPolicy Bypass -File run.ps1
Dev builds need Go 1.22+ and stable Rust:
go build -o viewpoint-server ./server/cmd/viewpoint-server
cargo build --release --manifest-path client/Cargo.toml --features audio