petere 50955fd606 feat: surface runtime errors in engine status
Record the most recent runtime error (capture, encode, packet, audio)
in the engine and expose it via Status.Err. The GUI shows it in the
status label (highlighted as a danger) and in the tray tooltip, so a
denied screen-share or encoder failure is visible without reading logs.
2026-09-19 10:13:17 +01:00
2026-09-18 18:36:19 +01:00
2026-09-18 18:36:19 +01:00
2026-09-18 18:36:19 +01:00
2026-09-18 18:36:19 +01:00
2026-09-18 18:36:19 +01:00
2026-09-18 18:36:19 +01:00

TeleportFling

Standalone Linux screen + audio sender for the OBS Teleport protocol.

TeleportFling captures a Wayland screen (via xdg-desktop-portal + PipeWire) and the system's default audio, encodes the video to JPEG, packetizes both into the Teleport protocol, and streams them over TCP so any OBS instance with the obs-teleport plugin can discover and display the stream.

Features

  • Real screen + audio capture on Wayland (PipeWire / xdg-desktop-portal).
  • LAN discovery via UDP multicast, matching obs-teleport's AnnouncePayload.
  • Multiple receivers — every connected OBS streams from one sender.
  • Headless CLI (teleportfling) and desktop GUI + system tray (teleportfling-gui).
  • Config persistence at ~/.config/teleportfling/config.json, customisable with --config.
  • Daemon mode via a per-user systemd service (see contrib/).

Build & run

Requires a Nix dev shell (or Go 1.26+ with libjpeg-turbo and the Fyne/GLFW native deps for the GUI).

nix develop
go build ./cmd/teleportfling       # headless CLI
go build ./cmd/teleportfling-gui   # desktop GUI + tray

Run:

./teleportfling --name "Studio" --port 9756

Flags: --name, --port, --quality, --fps, --source screen|pattern, --audio, --no-announce, --stream-index, --duration, --config.

Network requirements

TeleportFling uses two kinds of traffic:

Port Proto Direction Purpose
9756 TCP Sender → listen Video + audio stream to receivers
9999 UDP Sender → listen multicast discovery (peerdiscovery)

For a sender to be discoverable and reachable by OBS receivers on another machine, both machines need these ports open:

NixOS

networking.firewall = {
  enable = true;
  allowedTCPPorts = [ 9756 ]; # TeleportFling screen/audio streaming
  allowedUDPPorts = [ 9999 ]; # TeleportFling multicast discovery
};

Apply with sudo nixos-rebuild switch --flake .#<hostname>. If the machines are on separate/isolation LANs, Tailscale works as an alternative transport (point OBS at the receiver's Tailscale IP:port), but the multicast discovery list will only show senders reachable via LAN multicast.

Other distros / firewalls

Open TCP 9756 inbound and UDP 9999 inbound on the sender machine; receivers just need outbound access (or the same rules if a firewall restricts it). mDNS (UDP 5353) is only needed for zero-config name resolution, not for TeleportFling itself.

Daemon mode

See contrib/README.mdcontrib/install-daemon.sh installs a per-user systemd unit that runs the headless CLI with its own config.

Development

  • go build ./... — build
  • go test ./... — tests
  • golangci-lint run ./... — lint
  • See AGENTS.md and project.md for workflow and milestone history.

License

GPL-2.0, matching the obs-teleport project whose protocol we implement.

S
Description
Standalone Linux sender for the OBS Teleport protocol (Go, turbojpeg via cgo)
Readme GPL-2.0
38 MiB
Languages
Go 90%
Shell 5.7%
Nix 4.3%