Your computer’s audio, echoed to every phone nearby over Wi-Fi. Watch together on one screen while everyone listens on their own headphones. No accounts, no cables, and you approve every device.
Built with Rust + Tauri, with native Android playback and a browser fallback for iPhones. The name is an echo; the mark is a sound and the same shape turned around.
Windows: run the installer. Linux: make the AppImage executable, then open it. Android 8+: install the APK on your phone. On iPhone, scan the desktop’s QR code with the camera and open the browser client in Safari. macOS beta: Apple Silicon, macOS 13+. Open the DMG and drag eko to Applications.
Website and interactive walkthrough · All releases · The story behind eko
Early development: Linux is experimental, and latency and device compatibility are still being tested. There is no fixed latency guarantee.
- Start eko on your computer and play your audio.
- Scan its QR code with eko on Android, or choose a nearby host. Keep both devices on the same local network for local listening.
- Approve the phone on the desktop. Scanning a code never grants access by itself.
- Listen through the phone’s headphones. Repeat for the other listeners.
- Bring the headphones you already own. Each phone receives the audio and plays through its own output; no shared Bluetooth broadcast hardware is required.
- The desktop decides. Approve or deny requests, control sharing for each device, disconnect listeners, or stop the stream.
- Android first. Native receive and playback, with Media3 media controls. Play and pause affect only that phone; resuming returns to the live stream.
- A browser when you need one. iPhones and browsers join through the hosted
/clientpage. Android’s in-app scanner stays on the native receiver path. - Local when possible. Android LAN discovery and native local listening can work without internet. The hosted browser path needs internet for signaling and short-lived TURN credentials.
- Encrypted media. WebRTC prefers a direct connection. When direct browser media is blocked, Cloudflare TURN relays encrypted audio to approved receivers.
How the pieces fit
Desktop · Rust + Tauri
System audio → capture → WebRTC → approved listeners
QR pairing · LAN discovery · approval · session controls
|
+→ Android: native receiver + media controls
+→ iPhone / browser: hosted WebRTC client
Rust owns capture, signaling, discovery, approval, sessions, and media transport. React owns the screens. The hosted service exchanges signaling messages and supplies temporary TURN credentials; the desktop remains the authority for device access.
Only pair devices you trust and keep pairing links private. See the privacy policy and security policy.
The Chrome extension shares tab audio with approved listeners and reuses the
desktop app’s React components. Build its complete unpacked folder and Web Store
ZIP with pnpm ops extension:package. See extension setup, audit and publishing.
Install Node.js, pnpm, Rust, and the platform dependencies in the setup guide, then:
git clone https://github.com/Noelithub77/eko.git
cd eko
pnpm install
pnpm dev:desktopFor Android development on Windows, install Android Studio, the SDK, and the NDK, then run pnpm dev:android. Keep the Tauri development terminal running while using Android Studio. Linux diagnostics cover desktop audio and runtime investigation.
Previews and checks
UI-only previews do not capture or stream native audio:
pnpm dev:web:desktop
pnpm dev:web:mobile
pnpm dev:web:clientRun checks for the layer you changed:
pnpm test:types
pnpm lint
pnpm test:core
cd rust
cargo checkSee the setup guide for Android and device verification.
The landing page and browser receiver share one Vite build and Cloudflare Worker:
pnpm dev:web:site
# http://localhost:4040/
pnpm ops --helpUse a fork and open a pull request back to this repository. See contributing and the roadmap.
Changelog · Report a bug · Suggest a feature · Support · Code of conduct
eko is licensed under GNU AGPL v3 or later, AGPL-3.0-or-later. Forks and modifications must retain the license terms, including the applicable corresponding-source requirements. Fonts and dependencies retain their own licenses and attribution.
