Screener

Screener is a private, low-latency screen-sharing project for one game player and a small group of friends. Its media path is WebRTC P2P-first, with authenticated TURN fallback for network pairs that cannot connect directly. Viewers should be able to join from a desktop or mobile browser without installing the sender application.

The first measurable Web proof of concept is implemented. A host captures a screen, window, or browser tab and creates an expiring invitation for up to three viewers. The host can change the shared source without replacing healthy peer connections. Each viewer receives an independent WebRTC connection, so direct and TURN-relayed paths can coexist in one room. The Node.js service carries only room, authentication, ICE credential, and signaling traffic.

This is not yet a production release. Real cross-network TURN behavior, game audio, mobile browser lifecycle behavior, and latency targets still require the documented manual test matrix.

Run locally

Node.js 24 and npm 11 are required.

npm ci
npm run dev

Open http://localhost:8787. The default development configuration uses a localhost origin and has no STUN or TURN server, so it is suitable only for same-machine checks. Multi-device or cross-network use requires HTTPS and the production-shaped ICE configuration documented separately.

The server binds 127.0.0.1 by default. Set LISTEN_HOST=0.0.0.0 explicitly only when a container or trusted LAN deployment requires it. Production startup also requires separate TURN/UDP, TURN/TCP, and TURN/TLS-on-TCP-443 URLs; this is a configuration preflight, not evidence that the external relay path works.

Run the complete automated validation with:

npm run check

Start here:

S
Description
Free, open-source screen sharing for friends. P2P-first, with browser viewing, a desktop app and optional self-hosting.
https://piik.tv
Readme MIT
9.7 MiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 46.2%
Go 36.5%
C++ 5.9%
JavaScript 5%
CSS 2.5%
Other 3.9%