FluxCast
September 20, 2026 · View on GitHub
FluxCast streams a Linux desktop to a TV.
🌐 Need a free subdomain for your project? Check out sub.fluxcast.dev (GitHub repo) — a free GitOps subdomain registry for developers!
Demo
https://github.com/user-attachments/assets/ce01804c-2f86-4a5d-8ecf-d6f2a72f55d1
Project Status
Current validated scope:
wfdis the primary path and the only mode tested as release-ready.dlnaworks as fallback.castis experimental and currently not working in the tested Samsung setup.
The project currently focuses on WFD/Miracast on Linux (Hyprland/wlroots class setups).
DLNA and Cast are available, but they are best treated as fallback or experimental paths.
Current limitation:
- KDE/GNOME Wayland desktop capture uses
xdg-desktop-portalin WFD mode. - For portal mode, install Python dependency
dbus-nextand allow screen-share in the desktop picker dialog.
Translations
The tray picks your language up from the system locale, no configuration needed.
| Language | Maintainer |
|---|---|
| English | IlyaP358 |
| Русский | IlyaP358 |
| Čeština | IlyaP358 |
| Danish | normann |
| Deutsch | therealresonix |
| Français | t0mab |
| Español | Jemo121 |
| Português (Brasil) | Jemo121 |
| Svenska | Martan404 |
Adding your language means editing one JSON file and no code at all. See CONTRIBUTING.md.
Quick Start
Default WFD run (interactive monitor/peer selection):
python3 src/main.py
WFD with latency/session JSONL log:
python3 src/main.py --wfd-latency-log
DLNA fallback:
python3 src/main.py --protocol dlna --transport hls
Cast mode (optional, if your TV supports it):
python3 src/main.py --protocol cast
Force backend manually (if auto is not suitable on your session):
python3 src/main.py --capture-backend wf-recorder
python3 src/main.py --capture-backend x11grab
python3 src/main.py --protocol wfd --wfd-capture-backend portal
python3 src/main.py --protocol wfd --wfd-capture-backend wf-recorder
python3 src/main.py --protocol wfd --wfd-capture-backend x11grab
Android-based sinks (TV boxes, projectors) that connect but stay on a black screen:
python3 src/main.py --protocol wfd --wfd-aosp-pmt-pid
WFD P2P connection troubleshooting - talk to wpa_supplicant directly instead of going through NetworkManager, and optionally pin the group to a 2.4GHz channel for sinks that don't support Wi-Fi Direct on 5GHz:
python3 src/main.py --protocol wfd --wfd-p2p-backend wpas
python3 src/main.py --protocol wfd --wfd-p2p-backend wpas --wfd-p2p-channel 6
Needs the D-Bus policy in meta/zz-dev.fluxcast.wpa-supplicant.conf
installed to /usr/share/dbus-1/system.d/. On Debian/Ubuntu, a user in the
netdev group can run it without sudo, courtesy of the netdev grant in
the distro's own wpa_supplicant.conf; elsewhere (including Arch) it falls
back to sudo - see the file for details.
What Works Best
WFD (Primary)
screen + audio capture -> H.264/AAC RTP -> Wi-Fi Direct + RTSP -> TV WFD receiver
This is the lowest-latency and most predictable path in the current codebase.
DLNA (Fallback)
desktop capture -> HTTP stream -> DLNA/UPnP AVTransport -> native TV player
- Prefer
--transport hlson Samsung TVs. progressive-tscan freeze or stutter on some models.
Cast (Optional)
- Requires a TV/device with real Google Cast support.
- Requires
pychromecast. - Not reliable on many Samsung TV models.
Installation
AppImage
Download the latest FluxCast-x86_64.AppImage from the Releases page, then:
chmod +x FluxCast-x86_64.AppImage
./FluxCast-x86_64.AppImage
On first launch FluxCast will ask for your password once to install a system file for Wi-Fi Direct.
Depending on your desktop environment, you may need to install:
- Hyprland / Sway:
wf-recorder,ffmpeg - KDE / GNOME:
gst-plugins-ugly(package name varies by distro)
Debian / Ubuntu - .deb
Download the .deb matching your release from the Releases page and install it:
sudo apt install ./fluxcast_<version>~<codename>_amd64.deb
| Build | Release |
|---|---|
~bookworm | Debian 12 |
~trixie | Debian 13 |
~noble | Ubuntu 24.04 |
~resolute | Ubuntu 26.04 |
amd64 only - there is no arm64 build. A release stays in the table for as long
as it has upstream support, and its .deb stops being published once that ends.
Note
Ubuntu builds cover LTS releases only. Interim releases are not supported and never get their own package.
They are not locked out, though: the builds are gated on the python3 minor
version, so pick the one that matches yours and it will install.
python3 --version # e.g. 3.13.7 on Ubuntu 25.10 -> use the ~trixie build
Your python3 | Build to use |
|---|---|
| 3.11 | ~bookworm |
| 3.12 | ~noble |
| 3.13 | ~trixie |
| 3.14 | ~resolute |
This works because the virtualenv is tied to the Python version rather than the distribution, but it is untested and unsupported - bug reports from an interim release will most likely be closed as such.
There is no separate privileged step: the package installs the D-Bus policy for Wi-Fi Direct and reloads dbus for you.
The builds are not interchangeable. FluxCast bundles the Python dependencies
apt does not carry at a usable version (upnpclient is absent from the archive,
python3-pychromecast is 9.4.0 against a 14.0.5 requirement) in a virtualenv
under /opt/fluxcast, and those wheels are tied to the Python version they were
built against. Each package therefore declares the exact python3 minor version
it was built for, and apt refuses a package whose Python does not match rather
than installing something that fails on first import.
PyPI
pip install fluxcast
sudo fluxcast-install-system
fluxcast-install-system installs the D-Bus policy, desktop entry, and system packages (GStreamer, ffmpeg, NetworkManager, etc.). Run it once after the pip install.
Arch Linux - AUR
yay -S fluxcast
# or
paru -S fluxcast
fluxcast tracks the latest release. fluxcast-git builds the current main instead, if you want to run ahead of a release.
From source
git clone https://github.com/IlyaP358/fluxcast.git
cd fluxcast
pip install -r requirements.txt
sudo meta/install.sh
sudo systemctl reload dbus
sudo gtk-update-icon-cache /usr/share/icons/hicolor
Warning
If PIP refuses to install the required libraries to your system, you will need to do that yourself using your distro's package manager.
DLNA/Cast features require additional packages listed in requirements.txt.
System tools (just as important)
WFD mode also depends on system binaries, not only Python packages:
ffmpegwf-recorder(Wayland/wlroots capture path)xdg-desktop-portal(+ desktop backend:xdg-desktop-portal-kde/xdg-desktop-portal-gnome/xdg-desktop-portal-wlr)nmcli,gdbus,iw,wpa_cli(Wi-Fi Direct and diagnostics)pactl(audio monitor autodetect)
Use:
python3 src/main.py --doctor
to check your machine before running WFD.
Note: on KDE/GNOME Wayland, WFD auto backend now prefers portal first.
Note: on firewalld systems, FluxCast opens the WFD RTSP port (7236/tcp) for the duration of a session and closes it on exit (no-op without firewalld; disable with --wfd-no-firewall). See DOCUMENTATION.md -> "WFD and firewalld".
If you use ufw, open the WFD RTSP port before connecting:
sudo ufw allow 7236/tcp
Documentation
Detailed flags, modes, and usage examples:
documentation/DOCUMENTATION.md
Tested Environment
TVs and receivers:
| Device | Protocol | Source |
|---|---|---|
| Samsung UE55TU7092U | WFD, DLNA | IlyaP358 |
| LG OLED55B87LC | WFD | #72 |
| LG OLED55BX9LB | WFD | #11 |
| LG webOS UN8000PTA | WFD | #10 |
| LG webOS SM8100PTA | WFD | #30 |
| LG LED-43UD81 | WFD | #44 |
| Hisense VIDAA 32A5NQ | WFD | #56 |
| X1BQ-8461 projector | WFD | #84 |
| Samsung UN55DU8000GXZD | WFD | #12 |
| Samsung Galaxy Tab S9 FE | WFD | #48 |
| Microsoft 4K Wireless Display Adapter | WFD | #40 |
| Vizio TV with built-in Chromecast | Cast | #51 |
Wi-Fi adapters:
| Adapter | P2P support | Source |
|---|---|---|
| Intel AX201 | yes | #12, #72 |
| Intel AX210 | yes | #87 |
| TP-Link Archer T4U Plus (USB) | yes | #56 |
| Realtek RTL88x2bu (USB) | no | #56 |
| Realtek RTL8822CE | no | #45 |
Hardware:
ThinkBook 14 G4+ IAP
- CPU: Intel i5-1240P (16 threads) up to 4.40 GHz
- GPU: Intel Iris Xe Graphics
- RAM: 16 GB
Dell XPS 13 Plus — @alba4k
- CPU: Intel i5-1260P (16 threads) up to 4.70 GHz
- GPU: Intel Iris Xe Graphics
- RAM: 16 GB LPDDR5
ThinkPad T14 Gen 4
- CPU: Intel i7-1355U (12 threads) up to 5.00 GHz
- GPU: Intel Iris Xe Graphics
- RAM: 32 GB
HP ZBook Fury G8, i9 and i5 — #72, #87
- Wi-Fi: Intel AX210
- OS: EndeavourOS, KDE Plasma (X11)
Lenovo ThinkBook 16 G6 ABP — #40
- CPU: AMD Ryzen 5 7530U
- OS: Fedora Linux 44
Lenovo IdeaPad Slim 7 Pro 14IHUS — #53
- CPU: Intel i7-11370H (8 threads) 3.30 GHz
- OS: Arch Linux
ASUS VivoBook X515JF — #44
- OS: Arch Linux (zen kernel)
Desktop PC — #12
- Wi-Fi: Intel AX201
- OS: EndeavourOS
Steam Deck — #45
- Wi-Fi: Realtek RTL8822CE
- OS: SteamOS Holo 3.7.25
Software:
Arch Linux
- Kernels: 7.1.3-arch2-1, 7.0.8-arch1-1, 6.12.91-1-lts612
- WMs: Hyprland (0.55.4)
- DEs (for testing): KDE Plasma (6.6.5) | GNOME (50.1)
- Shell: zsh (5.9.2), fish (4.7.1)
- Terminal: kitty (0.47.4)
- Also reported: kernels 7.0.10-arch1-1, 7.0.10-zen1-1-zen, 7.0.12-arch1-1, 7.1.6-arch1-1 on KDE Plasma (#30, #44, #53, #89)
CachyOS
EndeavourOS — #12, #72, #87
- Kernels: 7.0.5-arch1-1, 6.18.38-3-lts
- DEs: KDE Plasma (X11)
Fedora Linux 44 — #40
- Kernels: 7.0.11-200.fc44
Manjaro Linux — #84
- Kernels: 6.18.39-1-MANJARO
- DEs: GNOME (50.3)
Linux Mint 22.3 — #56
- Kernels: 6.17.0-35-generic
Xubuntu — #51
- Kernels: 6.17.0-7-generic
- DEs: XFCE (X11)
SteamOS Holo 3.7.25 — #45
- Kernels: 6.11.11-valve27