Skip to content

Synapsr/Aircast

Repository files navigation

🌐 Language: Français | English

πŸŽ™οΈ Aircast

The Open-Source Desktop App for Radio Streaming

Stop paying for proprietary streaming software. Own your radio.

Latest Release GitHub Stars License Built with Tauri

⬇️ Download β€’ ✨ Features β€’ πŸ—οΈ Architecture β€’ 🀝 Contributing


Aircast logo

πŸ’‘ What is Aircast?

Aircast is a portable native desktop app that captures any audio input and streams it to an Icecast server. Pick your microphone, save your server presets, click Go Live. Add a music queue, jingle cartridges with one-shot triggering, mic ducking and crossfade in Studio mode.

Built for radio operators who want to own their tooling β€” no subscriptions, no cloud lock-in, no hidden costs.

                                                     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   πŸŽ™οΈ  Mic   ─┐                                       β”‚  🌐 Icecast    β”‚
              β”‚                                       β”‚     server     β”‚
   🎡  Music ─┼─►  Mixer  ─►  ffmpeg (PUT) ─►  ─────► β”‚  (your radio)  β”‚
              β”‚                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
   🎚️  Cart  β”€β”˜
              β”‚
              └────────► πŸ”Š Local monitor (always on, never cuts)

🎯 Why Aircast?

πŸ’Έ Free & Open-Source πŸŽ™οΈ Always-On Audio πŸ” Studio Mode
GPL-3.0 licensed. No subscriptions, no per-MB fees, ever. Local monitor never cuts when going live. Music queue, carts, ducking, crossfade.
πŸ“¦ Self-Contained πŸ–₯️ Truly Cross-Platform 🌍 i18n FR / EN
ffmpeg bundled. No install required. Native macOS, Windows, Linux. No Electron. French & English. Easy to extend.

⬇️ Quick Start

Download the latest build for your platform from the Releases page:

Platform File
🍎 macOS (Apple Silicon) Aircast_<version>_aarch64.dmg
πŸͺŸ Windows (portable) Aircast-portable-windows-x64.zip
πŸͺŸ Windows (installer) Aircast_<version>_x64-setup.exe
🐧 Linux aircast_<version>_amd64.deb / .AppImage

Aircast isn't signed yet (Apple Developer ID / Windows EV), so the OS will show a one-time warning the first time you launch the app. See the full installation guide for the exact 30-second procedure per platform (a single Terminal command for macOS, "Run anyway" for Windows, nothing for Linux).

Once installed: pick your microphone, add your Icecast server in Setup, click Go Live.


✨ Features

🎚️ Three modes, one app

Mode What it does
πŸŽ™οΈ Simple Pick a mic β†’ pick a server β†’ Go Live. The fastest path to air, sourceβ†’destination at a glance.
πŸŽ›οΈ Studio Music queue, 9-cart jingle bank, mic ducking, crossfade, on-air title chip. Full-featured radio panel.
πŸ“‘ Relay Rebroadcast another stream URL (HTTP/HTTPS/HLS/Icecast). Drop in named upstream sources, transcoded on the fly.

Each mode can be hidden in Settings β†’ Advanced if a station only uses one workflow.

πŸ“‘ Streaming

Feature Description
βš™οΈ Server presets Save and recall as many Icecast servers as you need (host, port, mount, codec, bitrate).
πŸ”Œ Any input device Built-in mic, USB interface, virtual cable β€” anything the OS exposes.
🎚️ Live VU meter Real-time RMS + peak monitoring at 20 Hz, with correct color-zoned scale (green/yellow/red at fixed positions, not stretched).
πŸ” Auto-reconnect Configurable retry interval on stream drops; instant fail-over on network blips.
🚨 Rich error dialog ffmpeg/Icecast errors are classified into actionable messages; the raw output stays available for debugging.
🎧 Codecs MP3 (libmp3lame) and AAC (native), 64–320 kbps.
🌐 Icecast 2.4+ HTTP PUT protocol β€” supports root mount path /, unlike the legacy icecast://.
⚠️ Live mode-switch guard Switching modes while on-air shows a modal listing the concrete consequences (music stops, mic opens, etc.) so you don't air silence by accident.

🎡 Studio mode

Feature Description
🎡 Music queue Drag in MP3/WAV/FLAC/OGG. Play, pause, reorder, remove. Stream-decoded, low memory.
🎚️ Cart bank 9 jingle slots, one-shot trigger, pre-decoded for instant playback.
πŸŽ™οΈ Mic ducking Music ramps down automatically when the mic opens. Configurable level.
πŸ”„ Crossfade Smooth transitions between tracks with a configurable duration.
🎼 Format-agnostic Custom FrameResampler handles any source rate (22 / 44.1 / 48 / 96 kHz, mono or stereo).
🏷️ Now Playing chip The title actually broadcast to listeners is shown live in the Now Playing card β€” one click to edit the broadcast settings.

πŸ“‘ Relay mode

Feature Description
πŸ”— Named sources Save as many upstream URLs as you want (HTTP/HTTPS audio streams, HLS .m3u8, Icecast, local files).
πŸ” Upstream reconnect If the upstream drops, Aircast retries with a 5 s linear backoff and live status feedback (connecting / streaming / reconnecting).
🎚️ Same destination UX Source β†’ arrow β†’ server flow makes "what plays from where" obvious at a glance.

🏷️ Now-playing broadcaster

Push the title to your Icecast /admin/metadata endpoint with source credentials only (no admin password needed β€” works with the mount-level auth that libshout and butt have used for years).

Mode What it pushes
🎼 Auto Renders a template from ID3 tags ({title} {artist} {album} {next_title} {station} {show} …). Configurable per preset.
πŸ“ Static Fixed text β€” useful for talk shows or pauses (e.g. "You're listening to Radio XYZ").
πŸ“‚ File Polls an external text file at a configurable interval (UTF-8 / UTF-16 BOM aware). Perfect for syncing with Mixxx, RadioDJ or other broadcasters.

Plus a mic override (different title shown when the mic is open) and a "push title now" test button. The currently-broadcasting title is shown live in a strip (Simple mode) or chip (Studio mode).

πŸ› οΈ Reliability & support

Feature Description
πŸ§ͺ 100+ unit tests 100 Rust + 37 TypeScript covering audio resampling, URL framing, BOM detection, presets, validation and i18n parity.
πŸ”’ Atomic preset writes Corrupt JSON falls back to defaults β€” never bricks the app.
πŸͺΆ Lock-free callbacks cpal real-time path uses only atomics + ring buffers. No allocation, no locking.
πŸ“Š Persistent rolling log Always-on file logger with rotation. Every stream/mode/error transition is timestamped.
🩺 Diagnostic bundle One click in Settings β†’ Advanced copies a sanitized report (version, OS, active config, last 300 log lines) ready to paste in a bug report.
🌐 Deep links aircast:// URL scheme to share server configurations.
πŸ›‘οΈ Isolated dev / prod data Dev builds (pnpm tauri:dev) use a separate identifier, so you can iterate locally without touching the production preset file.

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  React + TypeScript UI    β”‚ ── tauri::invoke ──►  β”‚  Rust backend (Tauri 2)       β”‚
β”‚  Tailwind v4, FR/EN i18n  β”‚ ◄── tauri events ───  β”‚   audio::capture (cpal)       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       β”‚   studio::mixer + resampler   β”‚
                                                    β”‚   stream::pipeline            β”‚
                                                    β”‚   presets::store              β”‚
                                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                     β”‚ stdin (s16le PCM)
                                                                     β–Ό
                                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                                    β”‚  ffmpeg sidecar (subprocess) β”‚
                                                    β”‚   HTTP PUT β†’ Icecast 2.4+    β”‚
                                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Capture is always-on as soon as a device is selected. The streaming pipeline taps into the same audio flow without restarting it β€” switching live β†’ idle never cuts the local monitor.

Full design notes in docs/architecture.md.


πŸ› οΈ Build from Source

Want to hack on it?

# Prerequisites: Rust (stable), Node 20+, pnpm 9+
git clone https://github.com/Synapsr/Aircast.git
cd Aircast
pnpm install
pnpm fetch-ffmpeg          # downloads the ffmpeg sidecar for your host
pnpm tauri dev             # runs the app in dev mode

To produce installable bundles for your host platform:

pnpm build:bundle          # β†’ src-tauri/target/release/bundle/...

CI builds for macOS (arm64 + x64), Windows and Linux are produced automatically on every git tag β€” see .github/workflows/release.yml.


🀝 Contributing

PRs are welcome. Read docs/contributing.md first β€” it covers local checks, style and the architecture invariants that came from real bugs. Don't break those without saying why.

The local check suite that CI runs on every PR:

cd src-tauri
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
cargo test --lib
cd ..
pnpm typecheck
pnpm test
pnpm build

πŸ“œ License

  • Aircast source β€” GPL-3.0-or-later, see LICENSE.
  • Bundled ffmpeg β€” LGPL static build. Aircast spawns ffmpeg as a separate subprocess, so under the FSF "mere aggregation" interpretation, ffmpeg's license does not propagate to Aircast's source.

Made with β™₯ for radio operators by Synapsr.


France 2030

Operation supported by the French State as part of the Territoires NumΓ©riques Γ‰ducatifs initiative of the Programme d'investissements d'avenir, operated by Caisse des DΓ©pΓ΄ts.

Discover Suite.Studio Β· Porte-Voix.app

About

Free, native, open-source desktop app to broadcast audio to Icecast: microphone, music queue, or relay another stream URL.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors