No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
MaidFox aee113a9ea
All checks were successful
Go check / check-go (push) Successful in 1m1s
chore(reposyncer): update repo baseline (#53)
This PR was automatically created by the reposyncer script via https://git.foxden.network/FoxDen/maid

Reviewed-on: #53
2026-09-26 10:09:12 -07:00
.forgejo/workflows chore(reposyncer): update repo baseline (#53) 2026-09-26 10:09:12 -07:00
cmd Fix golangci-lint issues 2026-09-25 23:21:48 -07:00
docs Forward mirror audio through a per-receiver virtual output device 2026-09-25 20:17:11 -07:00
internal Fix golangci-lint issues 2026-09-25 23:21:48 -07:00
.gitignore Rebuild on doubletake sender core; add AirPlay 2 URL playback and mirroring 2026-09-25 13:25:47 -07:00
.golangci.yml Fix golangci-lint issues 2026-09-25 23:21:48 -07:00
CLAUDE.md Play MKV files on Apple TV via on-the-fly HLS transmuxing 2026-09-25 19:52:47 -07:00
COPYING.GPL Rebuild on doubletake sender core; add AirPlay 2 URL playback and mirroring 2026-09-25 13:25:47 -07:00
go.mod Rebuild on doubletake sender core; add AirPlay 2 URL playback and mirroring 2026-09-25 13:25:47 -07:00
go.sum Rebuild on doubletake sender core; add AirPlay 2 URL playback and mirroring 2026-09-25 13:25:47 -07:00
LICENSE Rebuild on doubletake sender core; add AirPlay 2 URL playback and mirroring 2026-09-25 13:25:47 -07:00
README.md Forward mirror audio through a per-receiver virtual output device 2026-09-25 20:17:11 -07:00
renovate.json chore(reposyncer): update repo baseline (#53) 2026-09-26 10:09:12 -07:00

foxCast

foxCast is a project that aims to implement the current version of Apple's AirPlay protocol on the sender end.

In the end, it should be easy to stream any type of content to an Apple TV or other AirPlay receiver.

Status

Feature State
mDNS discovery ✅
Pairing (transient, PIN, password/Digest; saved credentials) ✅
Video URL playback (play <url>), incl. local files via built-in HTTP server (tvOS 26+ play-queue protocol) ✅ hardware-tested (AppleTV11,1, tvOS 27)
MKV playback: on-the-fly Matroska → HLS/fMP4 transmux (no re-encoding), local or HTTP(S) ✅ hardware-tested (UHD HEVC HDR10 + AC-3 remux, AppleTV11,1)
Screen mirroring (mirror, H.264/HEVC + audio, Wayland/X11) ✅ against the test receiver; hardware-tested upstream in doubletake (AppleTV11,1/14,1, tvOS 27)
Playback controls in the CLI (pause/seek) API exists (PlaybackSession.Rate/Scrub), not yet exposed
Audio-only streaming (RAOP) to speakers ⏳

Usage

foxCast discover                                  # list receivers
foxCast pair  -target 10.0.0.5                    # PIN pairing, saves credentials
foxCast play  -target 10.0.0.5 https://example.com/video.m3u8
foxCast play  -target 10.0.0.5 ./movie.mp4        # served from this machine
foxCast play  -target 10.0.0.5 /mnt/nas/movie.mkv # MKV: remuxed to HLS on the fly
foxCast play  -target 10.0.0.5 https://nas.example/movie.mkv  # needs HTTP Range support
foxCast probe /mnt/nas/movie.mkv                  # show which tracks will play
foxCast mirror -target 10.0.0.5                   # screen sharing (needs GStreamer)
                                                  # audio: adds a "<receiver> (foxCast)" output device
                                                  # and makes it the default while mirroring
foxCast mirror -target 10.0.0.5 -test -no-audio   # synthetic source

Matroska files are rewrapped as HLS with fMP4 segments while playing; video and audio are copied, not re-encoded. H.264/HEVC video (incl. HDR10, HLG, Dolby Vision 5/8; profile 7 plays its HDR10 base layer) and AAC/AC-3/E-AC-3/FLAC/Opus/ALAC/MP3 audio work. Every compatible audio track is selectable on the Apple TV; -audio 3,5 picks tracks. Text subtitles (SRT, ASS/SSA, WebVTT) become selectable WebVTT subtitles. TrueHD/DTS audio and bitmap subtitles (PGS, VobSub) are skipped. See docs/09.

The receiver fetches local and transmuxed media from foxCast's HTTP server, so a host firewall must let it in: pin the port with -http-port 7020 (and -port-range for timing) and open them.

Omit -target to pick from discovered receivers. Pass a PIN/password with $FOXCAST_CODE (preferred over -code). -debug or FOXCAST_TRACE=1 enables protocol logging.

Mirroring needs GStreamer (gst-launch-1.0 with base/good/bad/ugly/libav plugins) and, on Wayland, xdg-desktop-portal. The receiver probes a local UDP timing port during SETUP; use -port-range MIN-MAX to pin the ports if a firewall is in the way.

For hardware-free testing, run go run ./cmd/foxCast-test-receiver -profile modern -auth none -listen 127.0.0.1:7000 and point foxCast at -target 127.0.0.1.

Documentation

Protocol research and implementation notes are in docs/:

Sources

Receiver Implementations (primary protocol references)

Sender Implementations

Pairing Libraries

Protocol Documentation

Later goals

  • Screen mirroring (H.264/H.265 + AAC-ELD over TCP/UDP; requires real-time encoding)
  • xdg-desktop-portal integration for app and window capture
  • Runs on Windows as well
  • Support for any AirPlay receiver type (not just Apple TV)

License

foxCast is licensed under the GNU Lesser General Public License v3.0 or later (LGPL-3.0-or-later). See COPYING.GPL for the incorporated GPLv3 terms. Portions are derived from doubletake (LGPL-3.0-or-later).