{"id":50298176,"url":"https://github.com/asuramaya/kast","last_synced_at":"2026-05-28T10:32:52.377Z","repository":{"id":359428484,"uuid":"1246028785","full_name":"asuramaya/kast","owner":"asuramaya","description":"Windows Win+K-style cast panel for GNOME on Ubuntu — AirPlay, Miracast, and Chromecast behind one tray menu and a Super+K shortcut","archived":false,"fork":false,"pushed_at":"2026-05-22T01:27:30.000Z","size":72,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T05:52:29.493Z","etag":null,"topics":["airplay","casting","chromecast","gnome","miracast","pipewire","screen-mirroring","ubuntu","uxplay","wayland"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/asuramaya.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-21T19:57:43.000Z","updated_at":"2026-05-22T01:27:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/asuramaya/kast","commit_stats":null,"previous_names":["asuramaya/kast"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/asuramaya/kast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asuramaya%2Fkast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asuramaya%2Fkast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asuramaya%2Fkast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asuramaya%2Fkast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asuramaya","download_url":"https://codeload.github.com/asuramaya/kast/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asuramaya%2Fkast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33605378,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airplay","casting","chromecast","gnome","miracast","pipewire","screen-mirroring","ubuntu","uxplay","wayland"],"created_at":"2026-05-28T10:32:50.990Z","updated_at":"2026-05-28T10:32:52.360Z","avatar_url":"https://github.com/asuramaya.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kast\n\n[![ci](https://github.com/asuramaya/kast/actions/workflows/ci.yml/badge.svg)](https://github.com/asuramaya/kast/actions/workflows/ci.yml)\n[![release](https://img.shields.io/github/v/release/asuramaya/kast?sort=semver)](https://github.com/asuramaya/kast/releases/latest)\n[![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n`Kast` is a one-line Ubuntu setup that brings a **Windows `Win+K`-style cast panel** to\nGNOME on Ubuntu 25.10 — as a native **Quick Settings tile**. Open the system menu, pick a\ntarget, cast — and route audio to AirPlay speakers, all from the same panel as Wi-Fi/BT.\n\nIt is not a single protocol-unified backend. Linux has no one upstream stack for AirPlay,\nMiracast, and Chromecast, so Kast wires together the native packages that already ship in\nUbuntu 25.10 and presents them behind one Quick Settings tile and one shortcut.\n\n- Outbound AirPlay audio via PipeWire RAOP\n- Outbound Miracast and Chromecast display casting via `gnome-network-displays`\n- Inbound AirPlay receiver mode via `uxplay`\n- A single **Kast** tile in GNOME Quick Settings: cast targets, the AirPlay receiver toggle,\n  sink selection, and mirror/overlay mode, plus a preferences dialog\n\n## Scope\n\n- `AirPlay audio out`: yes\n- `AirPlay display out`: no native sender backend included\n- `Miracast display out`: yes, through `gnome-network-displays`\n- `Chromecast display out`: yes, through `gnome-network-displays`\n- `AirPlay receive in`: yes, through `uxplay` (off by default; PIN-gated when on)\n\n## One-Line Install\n\nRemote (downloads the latest release, then installs):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/asuramaya/kast/main/install.sh | bash\n```\n\nFrom a clone:\n\n```bash\ngit clone https://github.com/asuramaya/kast\ncd kast\n./install.sh\n```\n\nFlags: `--skip-apt` (don't touch apt), `--no-shortcut`, `--shortcut '\u003cPrimary\u003ek'`.\nAfter installing, run `kast doctor` to confirm the stack is healthy.\n\n## What The Installer Does\n\n1. Installs the native Ubuntu packages listed in [packages.txt](packages.txt).\n2. Enables PipeWire RAOP discovery with [50-raop.conf](config/pipewire/50-raop.conf).\n3. Installs the `kast` CLI into `~/.local/bin`.\n4. Installs the `uxplay` receiver service (left **off** by default — it's a LAN listener).\n5. Installs and enables the GNOME Quick Settings extension (the Kast tile + preferences).\n6. Adds a GNOME app launcher and a default `Super+K` shortcut.\n\n\u003e **Log out and back in** after installing — Wayland can't hot-reload shell extensions,\n\u003e so the Kast tile appears in Quick Settings only on your next login.\n\n## Updating\n\n```bash\nkast check-update    # is a newer release available?\nkast update          # update in place from the latest GitHub release\n```\n\nThe Kast tile also checks periodically and surfaces an \"⬆ Update to vX.Y.Z\" entry when one\nis available — clicking it runs the update for you.\n\n## Uninstall\n\n```bash\n./uninstall.sh            # remove kast (keeps your config)\n./uninstall.sh --purge    # also remove ~/.config/kast and state\n```\n\nApt packages are left installed (they are shared system components).\n\n## Repo Layout\n\n- [install.sh](install.sh): bootstrap entrypoint (self-bootstraps when piped from curl)\n- [uninstall.sh](uninstall.sh): symmetric uninstaller (`--purge` also removes config/state)\n- [scripts/kast](scripts/kast): runtime CLI; the extension shells out to `kast … --json`\n- [shell-extension/kast@asuramaya/](shell-extension/kast@asuramaya): the GNOME Quick Settings UI (`extension.js` tile + `prefs.js` dialog)\n- [systemd/user/uxplay.service](systemd/user/uxplay.service): AirPlay receiver (uses `uxplay -fs` for video-overlay mode)\n\n## Default UX\n\n- A Kast tile in the GNOME Quick Settings menu (top-right), next to Wi-Fi/BT\n- `Super+K` (the `Win+K` equivalent) launches display casting\n- `kast status` shows stack status; `kast doctor` runs a full health check\n- `kast cast-targets` lists Chromecast / Google Cast devices discovered on the LAN (mDNS)\n- `kast miracast-targets` scans for Wi-Fi Display (Miracast) sinks on demand\n- `kast select-airplay` switches the default sink to the first discovered AirPlay output\n- `kast select-local` returns audio to a local sink\n\nIf you actually want `Ctrl+K` instead of `Super+K`, install with:\n\n```bash\nKAST_SHORTCUT='\u003cPrimary\u003ek' ./install.sh\n```\n\n## Configuration\n\nCopy and edit:\n\n- [config/uxplay.conf.example](config/uxplay.conf.example)\n\nInstalled location:\n\n- `~/.config/kast/uxplay.conf`\n\nYou can set:\n\n- Receiver name\n- Extra `uxplay` flags such as `-h265` or `-pin`\n\n## Quick Settings tile\n\nOpen the system menu (top-right). One **Kast** tile sits alongside Wi-Fi/Bluetooth. Click\nthe tile to open the display picker; the ⌄ expands a native menu with two sections:\n\n- **Cast** — **Display Cast…**, **Miracast (drops Wi-Fi)…**, discovered **Chromecast**\n  targets (+ rescan), and an on-demand **Scan for Miracast displays**.\n- **Receiver** — an **AirPlay Receiver** on/off switch, mirror/overlay **Mode**, **AirPlay\n  output** sinks (+ Use Local Speakers), and **Restart Receiver**. The receiver is **off by\n  default** (it's a LAN-facing listener) — flip the switch on to receive; it's PIN-gated when\n  on, and PIN is only a 4-digit speed bump, so turn it back off when you're done.\n\nBelow that: **Sound/Display Settings…**, **Kast Settings…** (the preferences dialog), and the\nversion / update entry.\n\nSelecting a discovered target opens `gnome-network-displays` to complete the connection\n(see the limitation below).\n\n### Preferences\n\n**Kast Settings…** (or `gnome-extensions prefs kast@asuramaya`) opens an Adwaita dialog for\nthe receiver name, H.265, require-PIN, and the default \"drop Wi-Fi when casting\" behaviour.\nIt writes `~/.config/kast/uxplay.conf` — the same file the CLI reads.\n\n## Troubleshooting\n\nRun `kast doctor` first — it checks tools, discovery, the receiver, outbound casting, audio\nrouting, and desktop integration, and prints a fix hint for each problem.\n\n- **`kast: command not found`** — `~/.local/bin` isn't on your `PATH`. Add it to your shell\n  profile, or log out and back in.\n- **No Kast tiles in Quick Settings** — the extension loads only after a fresh login on\n  Wayland. Log out/in, then check `gnome-extensions list --enabled | grep kast` and\n  `kast doctor`. Enable manually with `gnome-extensions enable kast@asuramaya`.\n- **No Miracast displays found** — discovery is an on-demand Wi-Fi P2P find; some adapters\n  can't do P2P at all (`kast doctor` reports this). Try again near the display.\n- **Chromecast cast drops the network** — fixed in the default action; only the explicit\n  *Miracast (drops Wi-Fi)* item disconnects Wi-Fi. Use **Display Cast…** for Chromecast.\n- **AirPlay sinks don't appear** — confirm the RAOP config is installed (`kast doctor`) and\n  the speaker is on the same network.\n\n## Security\n\n`kast` runs entirely in your user session — there is no privileged daemon. Worth knowing:\n\n- **The AirPlay receiver is off by default.** It's a LAN-facing listener (`uxplay`) that\n  parses untrusted media, so turn it on (from the Kast tile) only while receiving, and off\n  when done. When on it is **PIN-gated**, but the PIN is a 4-digit speed bump — not strong\n  authentication, and it does not protect uxplay's parser. Off-when-idle is the real control.\n- Casting only **discovers** devices (Chromecast via mDNS, Miracast via Wi-Fi P2P) and never\n  auto-connects; selecting one hands off to `gnome-network-displays`. Discovered device names\n  are treated as untrusted and only ever reach `jq`/labels as text.\n- `~/.config/kast/uxplay.conf` is sourced by the CLI (like a shell rc file); the preferences\n  dialog escapes everything it writes there.\n- `install.sh` and `kast update` fetch over HTTPS from GitHub, and each release publishes a\n  `.sha256` for manual verification.\n\nFound a vulnerability? Please report it privately via the repository's **Security** tab —\ndetails in [SECURITY.md](SECURITY.md).\n\n## Status \u0026 Roadmap\n\nWhat is real today:\n\n- Installer and service plumbing\n- A unified GNOME Quick Settings tile — cast, receiver toggle, AirPlay sink routing, mode\n- Preferences dialog (receiver name, H.265, PIN, default Wi-Fi behaviour)\n- Inbound AirPlay receive via `uxplay`\n- Casting keeps Wi-Fi up by default (configurable); only the Miracast action drops it\n- Video-overlay mode via native `uxplay -fs` (works on Wayland)\n- In-panel Chromecast discovery via mDNS (`_googlecast._tcp`), listed in the Kast tile\n- On-demand Miracast display discovery via NetworkManager's Wi-Fi P2P D-Bus interface\n  (`kast miracast-targets`), listed in the panel behind a \"Scan for Miracast displays\" action\n\nKnown limitations:\n\n- Selecting a discovered target opens `gnome-network-displays` to finish the connection:\n  it owns the screencast pipeline and exposes no CLI/D-Bus to connect to a specific sink,\n  so Kast can discover and list devices but not auto-connect to them.\n- Chromecast discovery is passive (mDNS) and refreshes on a timer; Miracast discovery is an\n  active Wi-Fi P2P find that shares the radio, so it is on-demand only and never auto-polled.\n\nNext ideas:\n\n- If a future `gnome-network-displays` exposes a connect API (or a headless sink backend\n  lands), wire the listed targets straight through to a one-click connect.\n\nStill out of scope:\n\n- AirPlay display sender support — no Linux-native sender backend exists to wrap\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasuramaya%2Fkast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasuramaya%2Fkast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasuramaya%2Fkast/lists"}