The daemon's is_link_local_v6 guard could not see scoped fe80::…%iface hosts, so a later link-local mDNS resolution could clobber a good routable IPv4 host and break the session until the next re-resolution. Strip the %zone before parsing. Also invalidate a StartCast when the session dies (or StopCast fires) between negotiation and StartFinished, so the dead session is torn down instead of installed and the UI is not left stuck on Casting; add daemon actor tests for both races. Hardening: dedupe Cast/DLNA re-resolution forwards, tolerate a TRANSITIONING DLNA renderer after Play, fall back to if-addrs for LAN-IP enumeration when ip(8) is missing, harden the HTTP token fallback, and null-guard the estimated-bandwidth FFI getter. |
||
|---|---|---|
| .forgejo/workflows | ||
| breadcast | ||
| breadcast-caststream-sys | ||
| breadcast-core | ||
| breadcastd | ||
| ci | ||
| contrib | ||
| graphify-out | ||
| vendor/rust_cast-0.21.0 | ||
| .gitignore | ||
| AGENTS.md | ||
| bakery.toml | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CONTRIBUTING.md | ||
| EVENTS.md | ||
| LICENSE | ||
| README.md | ||
breadcast
Cast your screen to a Chromecast, Google TV, or DLNA renderer on the LAN. Two binaries:
breadcastd— background daemon. Discovers Cast (mDNS) and DLNA/UPnP (SSDP) devices, owns the portal screen-capture / encode pipeline, and runs the live session: Cast Streaming (vendored openscreen) or DLNA/AVTransport. One active session at a time.breadcast— GTK4 Layer Shell popup. Thin IPC client ofbreadcastd: pick a device, start or stop a cast. Closing the popup does not interrupt an active session.
This is a bakery product. It is not shipped on the BOS ISO and is not part of the default desktop — install it yourself if you want it.
Install
bakery install breadcast
That puts breadcast and breadcastd on $PATH (usually ~/.local/bin),
installs contrib/breadcastd.service as a systemd user unit, enables it,
and starts the daemon. bakery doctor breadcast checks the system
packages listed in bakery.toml first.
Requirements
- A Wayland compositor with Layer Shell and
xdg-desktop-portalScreenCast (Hyprland is the primary target) - GTK 4.12+ and
gtk4-layer-shell - GStreamer plus
gst-plugin-pipewire,gst-plugins-bad,gst-plugin-va(vah264enc), andgst-plugin-hlssink3 jsoncppandopenssl(runtime deps of the vendored Cast Streaming code)
From source you also need a Rust toolchain (edition 2021).
Build from source
git clone https://git.breadway.dev/Breadway/breadcast
cd breadcast
cargo build --release
Binaries land at target/release/breadcast and target/release/breadcastd.
cp target/release/breadcast target/release/breadcastd ~/.local/bin/
cp contrib/breadcastd.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now breadcastd
Usage
Start the daemon (or let the systemd unit handle it):
breadcastd
Open the device picker:
breadcast
Running breadcast again while it is open closes it (toggle). Click a
device to start mirroring — the portal picker asks which screen to share.
Stop mirroring ends the session. Status is Idle or Casting.
Discovery examples (optional, for debugging the LAN):
cargo run -p breadcast-core --example discover
cargo run -p breadcast-core --example dlna_discover
Hyprland keybind
On stock Hyprland, add the contents of contrib/hyprland.conf to your
hyprland.conf if you want Super+C and the frosted-glass blur:
layerrule = blur, breadcast
layerrule = ignorezero, breadcast
bind = $mainMod, C, exec, breadcast
BOS does not ship this app or a default keybind for it. Add one yourself if you install breadcast on a BOS machine.
bread event integration
breadcastd works the same with or without breadd. When breadd is
running, it publishes bread.cast.* and honors bread.command.cast.*.
See EVENTS.md for the bus contract. bread is not a bakery
dependency.
Theming
breadcast inherits its colour palette from bread-theme.