WiFi Audio Streaming

com.cuscus.wifiaudiostreaming
by Zapstore _@zapstore.dev

Republished from GitHub / F-Droid by the Zapstore main account.

First release: Sep 2, 2025, 6 total releases.

Most recent release: Aug 21, 2026.

Repo

Appears in 0 app stacks.

0 sats / 0 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Aug 21, 2026 1.2
    # WiFi Audio Streaming Android - v1.2 :tada: Last release I said I'd stop rewriting everything, then immediately designed a new protocol version and wrote a C implementation for it. So this time I set a rule: **do not touch the protocol.** And I actually kept it. WFAS is still v2, byte for byte, so Desktop 1.1 and Android 1.2 talk to each other perfectly fine. For the first time in this project's history, you don't have to update both sides in the same afternoon. Instead I spent the release teaching the app to talk to devices that have never heard of WFAS and never will. Your TV. Your AV receiver. That Raspberry Pi in the closet running Snapcast.
    More…
    Also I broke your automations. Sorry. The next section explains why, and the one after that tells you what to do about it. --- ## :shield: Security This release includes fixes to the authentication and local control paths, identified during a deeper security review of the code. I'm not going into detail here, because v1.1 installations may remain in the wild for months before updating. If you're running v1.1, please update to v1.2. --- ## :warning: Breaking Changes The protocol is untouched, so no "update both apps or nothing works" this time. I broke something else instead. **If you use NFC, Tasker, MacroDroid, ADB or `wifiaudio://` automation, this update requires action.** External commands are now off by default and require a token. After updating: 1. Open **Automation & Scripting** and turn on _External commands_. 2. Recopy the URIs and ADB commands from that screen — they already include your token. The token is stored encrypted on the device and is never transmitted to another device. You can regenerate it at any time, which invalidates every URI and NFC tag you've already written. Tiles, widgets and shortcuts are unaffected and need nothing. **The Automation & Scripting screen is now the only supported way in.** If you'd found some other way of driving the app from outside, generate the equivalent there instead — anything not listed on that screen should be considered unsupported. **Auto-connect only connects to servers you've starred**, which is what the name always implied. Star the ones you want and it does the rest. --- ## :tv: DLNA: your TV can play this now The big one: **the other device doesn't need this app.** Audio now goes straight to DLNA/UPnP renderers — smart TVs, AV receivers, soundbars, network speakers. Nothing to install on them. The phone finds them over SSDP, asks each one what it can actually play, negotiates a format and drives it. Pick a renderer, it starts playing. Your choices are remembered for next time, and a watchdog re-issues playback when one silently drops the stream, which they do a lot. ### DLNA is a standard, and I use that word loosely Every manufacturer implements it slightly differently and each is convinced their way is the correct one. Some refuse LPCM and want MP3. Some want a `Content-Length` on an infinite stream, which is a delightful thing to ask for. Some need a `Stop` before a new URI, some need 600 ms of silence before `Play` or they just sit there. So there's a quirk table now: Denon/Marantz/HEOS get longer delays, Sonos a different codec order, Samsung its `Content-Length`, LG and webOS a MIME override, Yamaha and MusicCast get WAV first. Everything else gets sensible defaults and a retry. If yours does something creative that isn't in there yet, the **Copy diagnostics** button produces exactly what I need to add it. One honest warning: DLNA receivers buffer heavily, so expect a few seconds of delay. Great for music, useless for video or gaming. Use WFAS for those. --- ## :loud_sound: Snapcast: actual multiroom The phone can now be a **Snapcast server**. Every snapclient on your network joins in and plays in sync — Raspberry Pi, ESP32, Home Assistant, the official Snapcast apps — room after room, actually aligned rather than roughly at the same time-ish. - Audio on **TCP 1704**, JSON-RPC control on **1705**, both advertised over mDNS so clients find it with zero config - **PCM, FLAC and Opus** (Opus needs 48 kHz stereo; if you're elsewhere it says so and falls back to PCM instead of failing silently) - Chunks of 10/20/40/60 ms, client buffer 200–5000 ms, configurable stream name - The home screen shows connected clients, their volume and latency, the active codec, and whether mDNS actually worked. A busy port is reported with its number instead of just not starting. --- ## :camera: Pair with a QR code Typing a 40-character key on a phone keyboard is not a pleasant experience, so now you don't. Point the camera at the code the other device shows: address, port and key arrive together, and the streaming connection is encrypted from the first packet. The part I like is that a QR-paired key is **256 random bits**, not a passphrase a human picked — a strong key without having to invent, type or remember one. On the wire it's still ordinary Key mode, so nothing else changes. - **Invites expire after two minutes**, so a code left up on a screen doesn't stay useful all afternoon - **The QR is an HTTPS link**, so scanning it with a phone that doesn't have the app lands on the download page instead of a dead custom scheme - **Encryption is mandatory for QR and multicast pairing** - If a code won't scan, tap it for a plain black-and-white version; the key is printed underneath in blocks of five if you have to read it out loud And if you scan a QR that isn't ours, the app has opinions about that. --- ## :electric_plug: Streaming over USB Plug the phone into the computer, turn on USB tethering, and the audio takes the cable instead of the air: lower latency, no Wi-Fi congestion, and it works in places where the network simply doesn't. - The app tells you exactly where you are — no cable, cable but tethering off, or connected — with a **shortcut straight to the tethering settings**, because that toggle is buried three menus deep on most phones - USB gets **its own jitter buffer** (5–120 ms, default 20). Some phones deliver USB packets in bursts and need _more_ buffer over the cable, not less. - Devices found over the cable are badged **Connected via USB** - New **WFAS availability** setting — _Always_, _Not on USB_ (default) or _Never_ — decides whether Wi-Fi keeps being offered while the cable is up - There's a `usb` scripting action too, and with no address it finds the peer on the cable by itself, since that address changes every session On the computer, just leave the desktop app on automatic interface selection. --- ## :headphones: Playback that doesn't click - **Latency correction is smooth.** The playback rate gets nudged by a fraction of a percent until the buffer lines up, instead of throwing packets away. Dropping only happens if the backlog stays high, and at most once every 250 ms. - **Lost packets get patched.** The app finds the best point to continue from and crossfades back in when the real stream returns. Where you used to hear a click, you now mostly hear nothing. - **Streams that drift too far get realigned** instead of accumulating lag forever. --- ## :stethoscope: "It says Connecting and then nothing" - **A device that never answers** now produces a dialog naming it, saying the other end is probably running an older version, and offering the download page - **Protocol mismatches name the guilty party** — sender, receiver or this device — with both version numbers. Two people on a call both reading "update required" and both assuming it's the other one was a real support thread. - **A server that doesn't accept a microphone says so**, instead of ignoring your client mic and leaving you to wonder --- ## :art: The spectrogram (I got distracted again) Remember `--groove` in the desktop CLI, the terminal visualiser that serves absolutely zero practical purpose? It's on Android now, behind the whole interface. Turn on **Background Spectrogram** and pick **Bars & Peaks** or **Fluid Waves**. And yes, **Groove** came with it: it subtracts the constant parts of the mix so the visualiser follows the melody instead of headbanging to the kick drum. There's a **"Show only in Dark Screen"** option, which is where I actually use it — dark screen plus a spectrogram on an OLED is a screensaver I didn't mean to build. --- ## :bell: Notifications got rebuilt - **Volume up and down straight from the notification**, with percentage and a proper muted state - **Four separate channels** — transmission, reception, auto-connect, automation — so you can silence exactly the one that annoys you - Live status chips, dedicated icons, accent colours, and updates that are throttled instead of firing once per status string - It **actually goes away when the stream stops.** It used to linger. It doesn't. --- ## :wrench: Other improvements - **Mute this device while streaming** (on by default), so you don't hear everything twice. Volume comes back when the server stops. - **Keep server running after disconnect**: in unicast a client leaving now ends the session, not the server — the port stays open and the next device walks right in - **Key strength meter** under the manually typed key. Guidance, not a gate, and the same maths runs on the desktop so both ends agree on what "strong" means. - **Protocol summary in the UI** — "Streaming with WFAS, RTP and DLNA" — instead of making you remember what you enabled - **Onboarding** gained cards for DLNA and Snapcast. It's five ways to send the same audio now. - **Bouncy Castle updated** to 1.78.1, and the two modules shipped without ever being used are gone - **ProfileInstaller** added, so startup is quicker - **README rewritten** with real screenshots and the new protocols. It also no longer contains the sentence "Fred lives in the title!" in the middle of the setup instructions... Yk, the settings... I hope Fred is doing well. --- ## :sparkling_heart: Support & Ko-fi Same as always: if this is useful to you there's a Ko-fi link. :) [Support on Ko-fi](https://ko-fi.com/marcomorosi) Enjoy v1.2!
  • Jul 22, 2026 1.1.0
    # WiFi Audio Streaming Android v1.1 :tada: I said 1.0 would be the release where I finally let this thing rest for a while. That lasted about as long as it took the desktop app to get the same idea. So here we are again: new protocol, new security model, new automation system, and a UI refresh nobody asked for but that I did anyway. ---
    More…
    # :warning: Before You Update This one's important, so no burying it at the bottom this time. This release speaks **WFAS Protocol v2**. It is **not** wire-compatible with v1.0, and it's not compatible with old versions of the desktop app either. **Update both sides together.** Same as always, you know the drill by now. The good news: incompatibility is no longer a mystery. Old and new versions used to just sit there in silence, pretending to connect while doing absolutely nothing. Now the handshake itself checks the protocol version on both ends, and if they don't match, you get an immediate, clear message telling you exactly which app needs updating. No more staring at **"Waiting..."** wondering if it's your Wi-Fi, your firewall, or personal betrayal. --- # :art: A Real Material 3 Expressive Redesign Let's be honest about where the UI was coming from: it worked, but it had that unmistakable _"solo dev, 2am, it compiles"_ look. Functional, a little sad, definitely not something you'd screenshot on purpose. This release throws that out and does it properly. The whole app has been rebuilt on **Material 3 Expressive**, and I mean actually rebuilt, following the guidelines end to end instead of bolting a couple of trendy components onto the old bones like last time. Motion, shape, color, spacing... all of it redone with intent. The home screen got reorganized too, since there's a lot more to show now (security, automation, all of it) and the old layout simply didn't have room. It's not going to win any design awards, but it's genuinely a different app to look at, and honestly, to use. --- # :new_moon: Dark Screen Mode This one's a bit more specific than it sounds, but it fixes something genuinely annoying. When your phone is acting as a client, locking the screen or leaving the app makes Android start throttling it in the background to save battery, which introduces audio artifacts. Not ideal when you're actively listening to a stream. So for OLED screens specifically, there's now a **Dark Screen** button. It keeps the app open and the screen technically on (so Android won't throttle it), but displays either: - a completely black overlay, or - a sleek outlined theme, your choice under **Settings → Personalization**. Best of both worlds: the screen looks off, the battery mostly agrees, and the stream stays glitch-free. --- # :globe_with_meridians: WFAS Protocol v2 The biggest change in this release is the one you'll never actually see: the protocol itself. Until now, the wire format only really existed inside this app's source code. That was fine right up until people started asking how to build their own compatible clients, and the honest answer was: > "Read the Kotlin." Not a great answer. So WFAS now has its own home, separate from both apps: :point_right: https://github.com/marcomorosi06/wfas-protocol It's not just a written specification. It also includes a tiny dependency-free **C99 reference implementation** (`wfas.c` + `wfas.h`) aimed at embedded and firmware projects: - ESP32 network speakers - STM32 receivers - RP2040 devices - Raspberry Pi appliances - ...or whatever people end up building. Features include: - No dynamic memory allocation - No libc beyond the basics - Hand-written endianness-safe serialization - Identical behavior on big- and little-endian MCUs Just give it a UDP socket and it gives you correctly framed packets. ### Under the hood An audio packet remains refreshingly simple: - 10-byte header containing: - magic bytes - protocol version - flags (including silence frames) - sequence number - monotonic sample position - followed directly by raw **16-bit PCM**. That sample position allows receivers to detect packet loss or reordering and conceal gaps cleanly instead of simply guessing. Discovery, handshake, and keep-alives all use the same UDP socket through plain ASCII control messages: - `HELLO_FROM_CLIENT` - `PING` - `BYE` - `WFAS_INCOMPATIBLE` - `WFAS_BUSY` Nothing exotic to implement, and everything is documented down to the byte level. ### Browser Developer Lab If you'd rather explore the protocol without writing code, there's also an in-browser lab (still under construction) that already includes: - packet inspector - live handshake walkthrough - HMAC-SHA256 demo - HKDF-SHA256 demo - from-scratch ChaCha20-Poly1305 implementation - RFC 8439 test-vector validation - self-test panel Everything runs entirely client-side. :point_right: https://www.marcomorosi.eu/wifi-audio-streaming/developers/ Android and Desktop are now simply two implementations of **WFAS**, not the definition of it. --- # :lock: Password Protection & End-to-End Encryption Probably the single most requested feature. Finally here. When starting a server, you can now choose who is allowed to connect: - **Off** — anyone can connect, just like before. - **Ask** — approve every incoming connection manually. - **Key** — only clients that know a shared password may connect. ## Key Mode Key mode provides two layers of security. ### Authentication During the handshake, both devices prove they know the shared password using a mutual challenge-response. The password itself is **never transmitted** over the network. ### Encryption Once authentication succeeds, that same secret derives unique session keys. Every audio packet is then: - encrypted with **ChaCha20-Poly1305** - authenticated before being accepted Anyone sniffing your Wi-Fi traffic will only see encrypted noise. The literal kind. This is especially useful on shared networks like dorms, offices, hotels, or anywhere you don't fully trust everyone else on the SSID. ### Development story Testing this feature was... memorable. At one point I had a bug on the decryption side, so instead of clean audio I got raw encrypted garbage blasted directly into my ears at full volume. Imagine the soundtrack to an exorcism. I nearly launched myself out of my chair. Anyway, it's fixed now, and I promise the feature is significantly calmer to use than it was to build. To be clear, that bug only ever existed during development. If decryption fails for any reason (wrong password, corrupted packet, etc.), the app simply drops the packet. Worst case: - you can't connect, or - you hear a brief moment of silence. Never surprise horror-movie sound effects (as far as I know). --- # :brain: Smarter Device Matching Device discovery is now more reliable. You're less likely to see: - duplicate devices - stale entries - servers disappearing permanently after a brief network interruption --- # :gear: Automation & Shortcuts The app can now be controlled externally through: - NFC tags - Tasker - MacroDroid - home-screen shortcuts - deep links - or whatever automation setup you prefer. You can: - start a server with a predefined configuration - connect to a saved device - mute the microphone - stop streaming ...all without opening the app. You can also save complete server or client configurations as named presets from **Settings**, making an entire setup just: - one tap, - one NFC scan, - or one shortcut away. --- # :arrows_counterclockwise: Update Checker The app can now check GitHub for new releases automatically and notify you when one is available. Or just tap **Check for Updates** whenever you feel like it. Prefer not to know? You can disable it entirely. --- # :wrench: Other Changes - Haptic feedback on key interactions (optional). - Advanced audio settings now expose latency and maximum payload size. - General connection-state improvements. - Rejected or pending connections no longer incorrectly show the UI as "streaming" before the handshake actually succeeds. --- # :computer: Update the Desktop App Too **WiFi Audio Streaming Desktop v1.1** is available too. Besides the protocol update, it includes: - automatic updates - firewall assistant - full CLI - and apparently a working ESP32 implementation held together by a cut headphone cable. Worth a look even if you mainly use the Android app. :point_right: https://github.com/marcomorosi06/WiFiAudioStreaming-Desktop/releases --- Thanks, as always, to everyone testing betas and filing issues. The microphone fixes, the security model, the discovery improvements... none of this happens without someone finding the bug first. --- If you'd like to support the project, **Ko-fi** is there. :coffee: [Support on Ko-fi](https://ko-fi.com/marcomorosi)
  • Apr 3, 2026 0.4.0-beta
    # Release v0.4.0-beta This major beta update introduces significant automation features, enhanced system integration through widgets and tiles, and a refined connection protocol. This version is designed to work in synergy with the Desktop Client v0.4.0-beta. ## What's New ### Automation & Intelligence * **Smart Auto-Connect:** The app can now automatically connect to specific IP addresses when detected online. This feature has been highly requested and is now available with a dedicated priority management system in the settings. * **Background Persistence:** Auto-connect logic is designed to function reliably even when the application is closed.
    More…
    * **Priority System:** New settings allow you to define which devices take precedence during the auto-discovery and connection phase. ### System Integration & UI * **Material You Widgets:** Two new interactive home screen widgets: * Server Controller: Start or stop the audio server instantly. * Client Controller: Start/stop client mode and view the active device list. * **Quick Settings Tiles:** Added two system tiles for the Android notification shade: * Server Toggle: Quick start/stop for the server. * Auto-Connect Trigger: Attempts an immediate connection to the IP address saved in the new "Quick Connect" settings field. * **App Shortcuts:** Long-pressing the app icon on the home screen now reveals shortcuts for quick server and client actions. * **Onboarding Fix:** Resolved a UI rendering bug where "Skip" and "Continue" buttons were incorrectly displayed on the Welcome Screen. ### Protocol & Core Improvements * **WFAS Handshake:** Overhauled the handshake logic for the native WFAS protocol. This mainly improves connection stability. * _Note: This version requires the Desktop Client v0.4.0-beta for native streaming._ * **Zombie Server Patch:** Fixed a persistent "ghost server" bug where the service would occasionally remain bound to a port even after being stopped. ## Technical Notes * The "Quick Connect" tile uses the IP address manually specified in the application settings under the "Automation" section. * The record audio permission remains optional and is only required if the microphone streaming experimental feature is enabled. ## Support the Project If you find this tool useful, consider supporting its development. Your contributions help maintain the project and prioritize new features. Support on Ko-fi: https://ko-fi.com/marcomorosi
  • Mar 23, 2026 0.3.3-beta
    ## What's New in v0.3.3-beta This is a strict technical patch required to fix a build pipeline issue with the **F-Droid inclusion scanner**. There are no new user-facing features or app bug fixes in this release. ### Technical Changes: * **Encoding Fix:** Fixed an invisible encoding issue where Windows PowerShell accidentally saved the `.gitignore` file in UTF-16 (injecting null bytes), causing Linux-based CI/CD bots to fail the scan. Converted back to clean UTF-8. * **Repository Cleanup:** Completely purged the compiled `app-release.apk` from the Git tracking tree to strictly satisfy F-Droid's reproducible build requirements. * **Version Bump:** Updated `versionCode` to `6` to trigger a fresh and clean build environment.
    More…
    _Note for users: If you are already on v0.3.2(1 also)-beta, you do not need to update. The app functionality is identical._
  • Mar 1, 2026 0.2.0-beta
    This second beta release focuses primarily on performance, significantly reducing audio latency, and introduces a few Quality of Life (QoL) improvements to provide a smoother user experience. #### Performance & Under the Hood * **Latency Reduction:** Reworked the audio buffer logic and hardware initialization. Structural delay has been minimized over standard Wi-Fi, and the handshake between devices got improved as well. * **UI Polish:** Smoother animations, improved haptic feedback, and a refined Material 3 Expressive design. #### What's New * **Server Volume Control:** You can now adjust the transmission volume directly from the UI slider or by using your device's physical volume buttons while streaming.
    More…
    * **Manual IP Connection:** Added the ability to manually enter a Server IP address to bypass network discovery issues, which is particularly useful if your router blocks Multicast/mDNS packets (it only works with **unicast** connections). #### Installation 1. Download the `.apk` file from the **Assets** section below. 2. Enable **installation from unknown sources** if prompted by the system. 3. Install the package and grant the required permissions on first launch (Audio, Notifications). #### Known Limitations (Beta) * **macOS Compatibility:** Currently, audio capture and overall connection stability on macOS are very poor and require significant rework. * **Network Sensitivity:** Due to the new low-latency buffers, congested Wi-Fi networks or weak signals might cause occasional audio "clicks" or drops. * Internal audio capture compatibility may vary across custom Android ROMs. * Higher than average battery consumption during active streaming. #### Feedback & Issues As this is still a beta, there is always room for improvement. Whether you want to report a bug, request a feature, or share technical advice on how to better handle audio streams and networking, your input in the **Issues** section of the repository is highly appreciated.
  • Sep 2, 2025 0.1.0-beta Release page →
    # Release v0.1.0-beta This is the first **beta release** of WiFi Audio Streaming for Android.\ The application enables **bidirectional audio streaming** (transmission and reception) over local networks, turning an Android device into a wireless audio endpoint. --- ## Key Features - **Server Mode**: Stream internal audio (Android 10+).
    More…
    - **Client Mode**: Receive audio streams. - **Networking**: Automatic server discovery (mDNS/UDP) with support for both **Unicast** and **Multicast** transmission. - **Audio Configuration**: Full control over sample rate, channels (mono/stereo), and buffer size. - **UI**: Native interface built with **Jetpack Compose** and **Material 3**. --- ## Installation 1. Download the `.apk` file from the **Assets** section. 2. Enable _installation from unknown sources_ if prompted by the system. 3. Install the package and grant the required permissions on first launch (Audio, Notifications). --- ## Known Limitations (Beta) - Audio latency depends on Wi-Fi network conditions. - Possible stream instability on congested networks or weak signals. - Internal audio capture compatibility may vary across custom Android ROMs. - Higher than average battery consumption during active streaming. --- ## Feedback & Issues Please report bugs and feature requests through the **Issues** section of the GitLab repository.