π Language: FranΓ§ais | English
Stop paying for proprietary streaming software. Own your radio.
β¬οΈ Download β’ β¨ Features β’ ποΈ Architecture β’ π€ Contributing
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)
| πΈ 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. |
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.
| 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.
| 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. |
| 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. |
| 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. |
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).
| 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. |
βββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββ
β 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.
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 modeTo 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.
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- 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.