Commit Graph
14 Commits
Author SHA1 Message Date
petere c1ad3416a1 docs: clarify audio format in flinger audio loop
The PipeWire stream negotiates S16LE stereo at 48 kHz; document that the
WAVE packets carry this directly.
2026-09-19 10:03:32 +01:00
petere 3084c438ee docs: add README with build, usage and network requirements
Document the two ports TeleportFling needs (TCP 9756 stream, UDP 9999
multicast discovery) and how to open them on NixOS and other firewalls,
based on the two-machine test.
2026-09-19 09:22:58 +01:00
petere 973c75f3b4 feat: add systemd user service for daemon mode
- contrib/teleportfling.service: per-user unit running the headless CLI
  with its own config (~/.config/teleportfling/daemon.json)
- contrib/install-daemon.sh: builds the binary, installs the unit and a
  starter daemon config
- contrib/README.md: install and management instructions
- todo.md: mark --config and daemon items complete
2026-09-19 08:35:12 +01:00
petere 34efbaf26d feat: support custom --config path in CLI and GUI
Add config.LoadFrom/SaveTo for arbitrary paths and thread a --config
flag through both entry points:
- CLI: --config loads a file first; explicit flags override file values
- GUI: --config selects the settings file used for load and save
- tests for LoadFrom/SaveTo and default fallback
2026-09-19 08:35:07 +01:00
petere b9a539e133 docs: add backlog todo.md with deferred GUI/CLI items 2026-09-18 21:20:56 +01:00
petere bb4073f8a3 feat: add tray streaming status and app icon
- tray icon and tooltip now reflect engine state: grey when stopped,
  green + live frame/drop counters in the tooltip while streaming
- generate a proper app icon (assets/, via cmd/teleportfling-icon) and
  embed it so the window and tray carry the icon without runtime files
- add a .desktop entry template for launching from an app menu
- run Fyne UI updates (status label, tray icon/tooltip) on the main
  thread via fyne.Do to satisfy the threading model
2026-09-18 21:20:52 +01:00
petere 2b3fd54934 feat: harden engine config, discovery and backpressure stats
- config: validate port/quality/fps/source/stream-index ranges on load
  and before engine start (flinger.Config.Validate)
- discovery: add Announce option to disable multicast (GUI checkbox,
  CLI --no-announce); absent JSON key keeps the default true
- backpressure: count dropped frames in the TCP sender, expose via
  engine Status and a live counter in the GUI status label
- docs: record M3/M4 decisions and X11 coverage via the portal backend
2026-09-18 20:44:39 +01:00
petere cb27a0d63d feat: add Fyne desktop GUI with system tray (M3)
- internal/gui: settings form (name, port, source, quality, fps, audio)
  wired to the flinger engine, config save/load, start/stop toggle
- system tray via Fyne's StatusNotifierItem: Show (raises window),
  Start/Stop, Quit; left-click shows the settings window
- cmd/teleportfling-gui entry point

Verified on Hyprland: tray icon registers, start/stop streaming works,
window shows and focuses from the tray.
2026-09-18 20:32:49 +01:00
petere ba423eb944 refactor: extract streaming engine into internal/flinger
Move the capture/encode/send pipeline out of cmd/teleportfling into a
GUI-free Engine so the CLI and the desktop app share one implementation:
- flinger: Config/Engine/Status, audio+video+stats loops, pattern source
- config: JSON persistence at ~/.config/teleportfling/config.json
- cmd/teleportfling: thin CLI wrapper around the engine (same flags)
- golangci: extend exclusions to flinger/config
2026-09-18 20:32:45 +01:00
petere 79beeefdc7 build: add Fyne/GLFW native deps to dev shell
Add libGL, mesa, wayland, libxkbcommon and the X client libraries the
Fyne cgo toolchain links against, plus LIBRARY_PATH so Go's linker finds
them (it does not read NIX_LDFLAGS).
2026-09-18 20:32:40 +01:00
petere 0cb96b5792 feat: add PipeWire screen and system audio capture (M2)
Capture the Wayland desktop via xdg-desktop-portal + PipeWire using
go2tv.app/screencast (MIT), and stream it to OBS:
- internal/capture: Capture/FrameSource/AudioSource interfaces and the
  PipeWire backend (BGRA frames at monitor resolution, S16 48 kHz stereo
  system audio)
- protocol: EncodeBGRA fast path producing 4:2:0 YCbCr JPEGs
- cmd: --source screen|pattern, --audio, --stream-index flags; real
  capture feeds the existing sender
- share one wall-clock reference between the audio and video loops so
  OBS receives aligned A/V timestamps (avoids multi-second latency)

Verified end-to-end: real desktop at 30 fps renders in OBS with
sub-second latency.
2026-09-18 19:19:22 +01:00
petere b6e7485786 build: allow Nix spa cflags in cgo builds
libspa-0.2.pc ships -fno-strict-aliasing/-fno-strict-overflow which Go's
cgo rejects unless explicitly allowed. This unblocks the PipeWire capture
dependency (go2tv.app/screencast) which uses #cgo pkg-config.
2026-09-18 19:19:16 +01:00
petere 10fa72b228 feat: implement M1 teleport protocol sender
Stream a synthetic test pattern and silent PCM audio over the OBS
Teleport protocol:
- protocol: wire format (Header/ImageHeader/WaveHeader), BT.709 full
  range colour matrix, JPEG encode via turbojpeg cgo, WAVE packet builder
- output: TCP sender with per-connection buffered channels and drop-on-overflow
- discovery: multicast announce via peerdiscovery
- cmd: teleportfling CLI with flags, test-pattern frame generator

Verified end-to-end: OBS discovers and renders the stream with correct
colours and motion.
2026-09-18 18:36:25 +01:00
petere b8b2ba8da1 chore: initial project scaffolding
Add project configuration, documentation and development tooling:
- flake.nix dev shell with Go, golangci-lint, turbojpeg
- .envrc sourcing sops-encrypted .secrets.env
- golangci-lint v2 config
- opencode.json MCP + LSP wiring
- AGENTS.md development guidelines
2026-09-18 18:36:19 +01:00