IlyaP358/fluxcast

Stream your Linux desktop to a Smart TV via Miracast/WFD, DLNA, or Chromecast.

Python

398

201 commits

updated Sep 22, 2026

See the code

See what people are saying

README

FluxCast

FluxCast streams a Linux desktop to a TV.

Release Python Platform Issues PRs

🌐 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:

  • wfd is the primary path and the only mode tested as release-ready.
  • dlna works as fallback.
  • cast is 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-portal in WFD mode.
  • For portal mode, install Python dependency dbus-next and allow screen-share in the desktop picker dialog.

Translations

The tray picks your language up from the system locale, no configuration needed.

LanguageMaintainer
EnglishIlyaP358
РусскийIlyaP358
ČeštinaIlyaP358
Danishnormann
Deutschtherealresonix
Françaist0mab
EspañolJemo121
Português (Brasil)Jemo121
SvenskaMartan404

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 hls on Samsung TVs.
  • progressive-ts can 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
BuildRelease
~bookwormDebian 12
~trixieDebian 13
~nobleUbuntu 24.04
~resoluteUbuntu 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 python3Build 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:

  • ffmpeg
  • wf-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:

DeviceProtocolSource
Samsung UE55TU7092UWFD, DLNAIlyaP358
LG OLED55B87LCWFD#72
LG OLED55BX9LBWFD#11
LG webOS UN8000PTAWFD#10
LG webOS SM8100PTAWFD#30
LG LED-43UD81WFD#44
Hisense VIDAA 32A5NQWFD#56
X1BQ-8461 projectorWFD#84
Samsung UN55DU8000GXZDWFD#12
Samsung Galaxy Tab S9 FEWFD#48
Microsoft 4K Wireless Display AdapterWFD#40
Vizio TV with built-in ChromecastCast#51

Wi-Fi adapters:

AdapterP2P supportSource
Intel AX201yes#12, #72
Intel AX210yes#87
TP-Link Archer T4U Plus (USB)yes#56
Realtek RTL88x2bu (USB)no#56
Realtek RTL8822CEno#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
  • Kernels: 7.0.3-1-cachyos
  • DEs (for testing): KDE Plasma (6.6.4)
  • Shell: bash (5.3.9)
  • Terminal: konsole (26.4.0)
  • Also reported: kernels 7.0.5-2, 7.0.10-2 on KDE Plasma (#10, #40)
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
cast
gnome
hyprland
kde-plasma
linux
miracast
pipewire
python
screencast
screencasting
screensharing
screensharing-tool
sway
xdg-portal

Contributors

IlyaP358

168 commits

Jemo121

7 commits

jainprashul

3 commits

hardiepiennar

2 commits

IlyaP358/fluxcast

Stream your Linux desktop to a Smart TV via Miracast/WFD, DLNA, or Chromecast.

Python

398

201 commits

updated Sep 22, 2026

See the code

See what people are saying

README

FluxCast

FluxCast streams a Linux desktop to a TV.

Release Python Platform Issues PRs

🌐 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:

  • wfd is the primary path and the only mode tested as release-ready.
  • dlna works as fallback.
  • cast is 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-portal in WFD mode.
  • For portal mode, install Python dependency dbus-next and allow screen-share in the desktop picker dialog.

Translations

The tray picks your language up from the system locale, no configuration needed.

LanguageMaintainer
EnglishIlyaP358
РусскийIlyaP358
ČeštinaIlyaP358
Danishnormann
Deutschtherealresonix
Françaist0mab
EspañolJemo121
Português (Brasil)Jemo121
SvenskaMartan404

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 hls on Samsung TVs.
  • progressive-ts can 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
BuildRelease
~bookwormDebian 12
~trixieDebian 13
~nobleUbuntu 24.04
~resoluteUbuntu 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 python3Build 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:

  • ffmpeg
  • wf-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:

DeviceProtocolSource
Samsung UE55TU7092UWFD, DLNAIlyaP358
LG OLED55B87LCWFD#72
LG OLED55BX9LBWFD#11
LG webOS UN8000PTAWFD#10
LG webOS SM8100PTAWFD#30
LG LED-43UD81WFD#44
Hisense VIDAA 32A5NQWFD#56
X1BQ-8461 projectorWFD#84
Samsung UN55DU8000GXZDWFD#12
Samsung Galaxy Tab S9 FEWFD#48
Microsoft 4K Wireless Display AdapterWFD#40
Vizio TV with built-in ChromecastCast#51

Wi-Fi adapters:

AdapterP2P supportSource
Intel AX201yes#12, #72
Intel AX210yes#87
TP-Link Archer T4U Plus (USB)yes#56
Realtek RTL88x2bu (USB)no#56
Realtek RTL8822CEno#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
  • Kernels: 7.0.3-1-cachyos
  • DEs (for testing): KDE Plasma (6.6.4)
  • Shell: bash (5.3.9)
  • Terminal: konsole (26.4.0)
  • Also reported: kernels 7.0.5-2, 7.0.10-2 on KDE Plasma (#10, #40)
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
cast
gnome
hyprland
kde-plasma
linux
miracast
pipewire
python
screencast
screencasting
screensharing
screensharing-tool
sway
xdg-portal

Contributors

IlyaP358

168 commits

Jemo121

7 commits

jainprashul

3 commits

hardiepiennar

2 commits

Languages

Python

98.0%

Shell

1.8%