No description
Find a file
Breadway b5ea779c06 Fix scoped link-local clobbering and the in-flight start-death race
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.
2026-08-30 19:07:47 +08:00
.forgejo/workflows Route vX.Y.Z-rc.N tags to the beta track, not stable 2026-08-16 14:19:42 +08:00
breadcast Fix Cast teardown leaks, keyframe latch, and DLNA session lifecycle 2026-08-16 14:16:23 +08:00
breadcast-caststream-sys Fix scoped link-local clobbering and the in-flight start-death race 2026-08-30 19:07:47 +08:00
breadcast-core Fix scoped link-local clobbering and the in-flight start-death race 2026-08-30 19:07:47 +08:00
breadcastd Fix scoped link-local clobbering and the in-flight start-death race 2026-08-30 19:07:47 +08:00
ci ci: build on bread-ecosystem's shared Arch container 2026-08-05 19:16:28 +08:00
contrib Fix Cast teardown leaks, keyframe latch, and DLNA session lifecycle 2026-08-16 14:16:23 +08:00
graphify-out docs: describe the shipped bakery product and single-trunk releases 2026-08-15 21:38:38 +08:00
vendor/rust_cast-0.21.0 Fix Cast teardown leaks, keyframe latch, and DLNA session lifecycle 2026-08-16 14:16:23 +08:00
.gitignore gitignore: ignore graphify-out/ knowledge-graph cache 2026-08-15 22:34:21 +08:00
AGENTS.md Route vX.Y.Z-rc.N tags to the beta track, not stable 2026-08-16 14:19:42 +08:00
bakery.toml Fix Cast teardown leaks, keyframe latch, and DLNA session lifecycle 2026-08-16 14:16:23 +08:00
Cargo.lock Fix scoped link-local clobbering and the in-flight start-death race 2026-08-30 19:07:47 +08:00
Cargo.toml Implement Cast Streaming mirroring, DLNA casting, daemon+GUI, and breadd integration 2026-08-03 09:07:21 +08:00
CONTRIBUTING.md docs: describe the shipped bakery product and single-trunk releases 2026-08-15 21:38:38 +08:00
EVENTS.md Fix Cast teardown leaks, keyframe latch, and DLNA session lifecycle 2026-08-16 14:16:23 +08:00
LICENSE Implement Cast Streaming mirroring, DLNA casting, daemon+GUI, and breadd integration 2026-08-03 09:07:21 +08:00
README.md docs: describe the shipped bakery product and single-trunk releases 2026-08-15 21:38:38 +08:00

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 of breadcastd: 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-portal ScreenCast (Hyprland is the primary target)
  • GTK 4.12+ and gtk4-layer-shell
  • GStreamer plus gst-plugin-pipewire, gst-plugins-bad, gst-plugin-va (vah264enc), and gst-plugin-hlssink3
  • jsoncpp and openssl (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.