IFM Distribution
Goal: Make IFM trivial to install, run, and embed — everywhere.
Product Matrix
| Product | Type | Target | Primary Channel |
|---|---|---|---|
| ifm-cli | Binary | Node operators, developers | Homebrew, winget, apt, cargo, GitHub Releases |
| ifm-node | Binary / Container | Server operators, infra | Docker Hub, GHCR, GitHub Releases, Linux packages |
| @ifm/sdk | npm package | JS/TS app developers | npm (public), JSR |
| @ifm/sdk-wasm | npm + WASM | Browser apps, edge workers | npm, jsDelivr CDN |
| ifm-react | npm package | React developers | npm |
| ifm-vue | npm package | Vue developers | npm |
| ifm-python | PyPI package | Python developers | PyPI |
| ifm-go | Go module | Go developers | pkg.go.dev |
| libifm | C shared library | FFI, embedding, mobile | GitHub Releases, system packages |
| ifm-android | AAR | Android apps | Maven Central |
| ifm-ios | XCFramework | iOS/macOS apps | GitHub Releases, CocoaPods, SPM |
| ifm-flutter | Pub package | Flutter/Dart apps | pub.dev |
| ifm-pwa | PWA (WASM + Service Worker) | Mobile listeners, audience | HTTPS (ifm.sh/pwa), GitHub Pages, CDN |
| IFM Station | Desktop App (Tauri) | Broadcasters, content creators | GitHub Releases, Homebrew, winget, apt, scoop |
| IFM Relay Station | Desktop App (Tauri) | Mesh operators, infrastructure | GitHub Releases, Homebrew, winget, apt, scoop |
| IFM Radio Listener | Desktop App (Tauri) | End users, audience | GitHub Releases, Homebrew, winget, apt, scoop |
Distribution Philosophy
- Zero-friction install — One command, no config, works immediately
- Platform-native — .deb/.rpm/.apk, .msi, .dmg, .pkg, Homebrew, winget, Scoop, Chocolatey
- Language-native — npm, PyPI, Cargo, Go, Maven, CocoaPods, SPM, pub.dev
- Container-first — Docker/OCI images for every service binary
- Verifiable — SLSA Level 3, cosign signatures, SBOMs, reproducible builds
- Auto-updatable — Built-in update checks, background updates for daemons
Release Cadence
| Channel | Frequency | Use Case |
|---|---|---|
| Nightly | Every commit to main | Early testing, CI integration |
| Beta | Every 2 weeks | Pre-release validation |
| Stable | Every 6 weeks (or as needed) | Production use |
| LTS | Annual, 2-year support | Enterprise, embedded |
Versioning: SemVer (MAJOR.MINOR.PATCH)
MAJOR— Breaking protocol/API changesMINOR— New features, backward compatiblePATCH— Bug fixes, security patches
Target Platforms
Tier 1 (Full Support, CI Tested)
| Platform | Arch | ifm-cli | ifm-node | @ifm/sdk | libifm | ifm-pwa | Desktop Apps |
|---|---|---|---|---|---|---|---|
| Linux | x86_64 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Linux | aarch64 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Linux | armv7 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| macOS | x86_64 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| macOS | arm64 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Windows | x86_64 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Windows | arm64 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| FreeBSD | x86_64 | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
| Web (WASM) | wasm32 | ❌ | ❌ | ✅ | ❌ | ✅ | ❌ |
Tier 2 (Community Maintained)
| Platform | Arch | Notes |
|---|---|---|
| OpenBSD | x86_64, arm64 | Ports tree |
| NetBSD | x86_64, arm64 | pkgsrc |
| Illumos | x86_64 | Tribblix, OmniOS |
| Android | arm64, x86_64 | NDK build |
| iOS | arm64 | Xcode build |
| WASI | wasm32 | wasmtime, wasmer |
Installation Methods by Audience
End Users (CLI)
# Universal installer (detects OS/arch, verifies checksum, installs to ~/.local/bin)
curl -fsSL https://ifm.sh/install.sh | bash
# Package managers
brew install ifm # macOS/Linux
winget install IFM.IFM # Windows
scoop install ifm # Windows
choco install ifm # Windows
apt install ifm # Debian/Ubuntu (official repo)
pacman -S ifm # Arch Linux
dnf install ifm # Fedora
zypper install ifm # openSUSE
apk add ifm # Alpine
emerge ifm # Gentoo
nix-env -iA nixpkgs.ifm # NixOSServer Operators (Node)
# Docker
docker run -d --name ifm-node \
-p 8080:8080 -p 8081:8081/udp \
-v ifm-data:/data \
ghcr.io/ifm/ifm-node:stable
# Kubernetes
helm repo add ifm https://charts.ifm.sh
helm install ifm-node ifm/ifm-node
# systemd (Linux packages)
systemctl enable --now ifm-nodeDesktop App Users
# IFM Station — Broadcaster studio
curl -fsSL https://ifm.sh/install-station.sh | bash
brew install ifm-station # macOS/Linux
winget install IFM.Station # Windows
scoop install ifm-station # Windows
apt install ifm-station # Debian/Ubuntu
# IFM Relay Station — Mesh relay + dashboard
curl -fsSL https://ifm.sh/install-relay-station.sh | bash
brew install ifm-relay-station # macOS/Linux
winget install IFM.RelayStation # Windows
scoop install ifm-relay-station # Windows
apt install ifm-relay-station # Debian/Ubuntu
# IFM Radio Listener — Consumer listening app
curl -fsSL https://ifm.sh/install-radio-listener.sh | bash
brew install ifm-radio-listener # macOS/Linux
winget install IFM.RadioListener # Windows
scoop install ifm-radio-listener # Windows
apt install ifm-radio-listener # Debian/UbuntuJavaScript/TypeScript Developers
# Core SDK (Node.js, Bun, Deno, Cloudflare Workers)
npm install @ifm/sdk
# or
bun add @ifm/sdk
# or
deno add @ifm/sdk
# Browser (WASM) — via CDN for quick prototyping
<script type="module">
import { IFM } from "https://cdn.jsdelivr.net/npm/@ifm/sdk-wasm@latest/dist/index.js";
</script>
# React / Vue integrations
npm install @ifm/react @ifm/vuePython Developers
pip install ifm
# or
poetry add ifm
# or
uv add ifmGo Developers
go get github.com/ifmprotocol/ifm-go@v1.2.3Rust Developers
# Cargo (for embedding in Rust apps)
cargo add ifm-core
# Binary install
cargo install ifm-cliMobile Developers
# Android (Gradle)
implementation 'sh.ifm:ifm-android:1.2.3'
# iOS (CocoaPods)
pod 'IFM', '~> 1.2'
# iOS (Swift Package Manager)
.package(url: "https://github.com/ifmprotocol/ifm-swift.git", from: "1.2.0")
# Flutter/Dart
flutter pub add ifm_flutterMobile Listeners (PWA) — ifm-pwa
# Zero-install: Open in mobile browser
https://ifm.sh/pwa
# Add to Home Screen (iOS Safari / Android Chrome)
# → Share → "Add to Home Screen"
# Direct station tuning via URL
https://ifm.sh/pwa#91.700
https://ifm.sh/pwa#station/callsign
# QR codes for stations
https://ifm.sh/qr/91.700.pngFeatures:
- Radio-like interface — Large frequency display, simple knob/tap tuning
- Offline-first — Service Worker caches station metadata & last-played stream
- Background audio — Continues playing when screen locked / app switched
- Push notifications — "Station X is now live" (with user permission)
- Share station — Web Share API / QR code generation
- No app store — Pure HTTPS, updates on refresh, zero-friction
Embedded / C FFI
# Debian/Ubuntu
apt install libifm-dev
# Arch
pacman -S libifm
# Manual (GitHub Releases)
wget https://github.com/ifmprotocol/ifm/releases/download/v1.2.3/libifm-1.2.3-linux-x86_64.tar.gzRelease Artifacts
Every release publishes:
| Artifact | Format | Signed | SBOM |
|---|---|---|---|
ifm-cli | tar.gz, .zip, .deb, .rpm, .apk, .msi, .pkg, .dmg | ✅ cosign | ✅ SPDX |
ifm-node | tar.gz, Docker (multi-arch), .deb, .rpm | ✅ cosign | ✅ SPDX |
@ifm/sdk | npm tarball | ✅ npm attestation | ✅ SPDX |
libifm | tar.gz (headers + .so/.dylib/.dll + .a/.lib) | ✅ cosign | ✅ SPDX |
| Mobile | .aar, .xcframework.zip | ✅ cosign | ✅ SPDX |
| ifm-pwa | Static site (HTML/JS/WASM + SW + manifest) | ✅ cosign | ✅ SPDX |
| IFM Station | .dmg, .msi, .AppImage, .deb, .rpm | ✅ cosign | ✅ SPDX |
| IFM Relay Station | .dmg, .msi, .AppImage, .deb, .rpm | ✅ cosign | ✅ SPDX |
| IFM Radio Listener | .dmg, .msi, .AppImage, .deb, .rpm | ✅ cosign | ✅ SPDX |
| Source | tar.gz, git tag | ✅ cosign | ✅ SPDX |
All artifacts → GitHub Releases + package registries + ifm.sh CDN
Desktop App Distribution
macOS (Tauri IFM Station / Relay Station / Radio Listener)
No Apple Developer account is required to build or distribute. Tauri apps are built to an .app bundle, then packaged as .dmg or .zip for distribution via your website or GitHub Releases.
Building & distributing unsigned macOS apps:
An unsigned app downloaded from the Internet will trigger macOS Gatekeeper. The user can open it by going to:
System Settings → Privacy & Security → Open Anyway
Apple explicitly supports manually overriding Gatekeeper for unidentified/unsigned applications. An unsigned build is perfectly reasonable for developers, testers, early adopters, and your own infrastructure.
Distribution files:
What you don't get without an Apple Developer account:
- ❌ Mac App Store distribution
- ❌ Developer ID signing
- ❌ Apple notarization
- ❌ seamless Gatekeeper trust
- ❌ identified-developer experience
For broad public distribution, Apple recommends getting the Developer Program membership and adding Developer ID + notarization. However, for early development and internal distribution, unsigned builds work fine.
Windows (Tauri IFM Station / Relay Station / Radio Listener)
Tauri apps build to Windows installers (.msi) or portable (.zip). Unsigned Windows apps trigger SmartScreen, but users can override:
- Click "More info" on the SmartScreen warning
- Click "Run anyway"
Distribution files:
Linux (Tauri IFM Station / Relay Station / Radio Listener)
Tauri apps build to Linux installers (.deb, .rpm) or portable (.AppImage, .tar.gz). Linux distributions generally allow unsigned apps without restriction.
Distribution files:
dist/pwa/ ├── index.html # Entry point ├── manifest.json # PWA manifest (name, icons, start_url, display: standalone) ├── sw.js # Service Worker (offline, background sync, push) ├── ifm-sdk.js # JS glue (from @ifm/sdk-wasm) ├── ifm-sdk_bg.wasm # WASM binary (~400 KB gzipped) ├── icons/ │ ├── icon-72.png # PWA icons (72, 96, 128, 144, 152, 192, 384, 512) │ ├── icon-192.png │ └── icon-512.png ├── stations.json # Cached station index (updated via SW) └── version.json #
**Deploy targets:**
- `https://ifm.sh/pwa/` (primary, Cloudflare Pages / Netlify / GitHub Pages)
- `https://pwa.ifm.sh/` (alias)
- GitHub Pages: `https://ifm.github.io/ifm-pwa/`
- CDN: `https://cdn.jsdelivr.net/gh/ifm/ifm-pwa@latest/`
### Desktop Apps Build Outputreleases/v0.1.0/desktop/ ├── ifm-station-darwin-arm64.dmg ├── ifm-station-darwin-x64.dmg ├── ifm-station-windows-x64.msi ├── ifm-station-windows-arm64.msi ├── ifm-station-linux-x64.AppImage ├── ifm-station-linux-arm64.AppImage ├── ifm-station_0.1.0_amd64.deb ├── ifm-station-0.1.0.x86_64.rpm ├── ifm-relay-station-darwin-arm64.dmg ├── ... (same matrix for relay-station) ├── ifm-radio-listener-darwin-arm64.dmg ├── ... (same matrix for radio-listener) └── checksums-desktop.txt
---
## Verification
```bash
# Verify cosign signature (CLI binary)
cosign verify-blob \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity https://github.com/ifmprotocol/ifm/.github/workflows/release.yml@refs/heads/main \
ifm-cli-linux-x86_64.tar.gz
# Verify npm attestation
npm attestation verify @ifm/sdk@1.2.3
# Verify Docker image
cosign verify ghcr.io/ifm/ifm-node:v1.2.3 \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp "https://github.com/ifmprotocol/ifm/.github/workflows/.*"
# Checksums (published to ifm.sh/checksums.txt)
sha256sum -c ifm.sh/checksums.txtAuto-Update
| Product | Mechanism |
|---|---|
ifm-cli | Built-in ifm update — checks GitHub Releases, verifies signature, replaces binary |
ifm-node (daemon) | systemd timer + ifm-node --self-update / Docker watchtower |
@ifm/sdk | npm outdated / Dependabot / Renovate |
| Docker images | Watchtower, Diun, or docker pull ghcr.io/ifm/ifm-node:stable |
| ifm-pwa | Service Worker skipWaiting + clients.claim — updates on next load; optional navigator.serviceWorker.register().update() prompt |
| Desktop Apps | Tauri Updater — checks GitHub Releases, verifies cosign signature, downloads & installs |
Support Matrix
| Product | Linux | macOS | Windows | Web | Mobile |
|---|---|---|---|---|---|
| ifm-cli | ✅ | ✅ | ✅ | ❌ | ❌ |
| ifm-node | ✅ | ✅ | ✅ | ❌ | ❌ |
| @ifm/sdk | ✅ | ✅ | ✅ | ✅ | ✅ |
| @ifm/sdk-wasm | ❌ | ❌ | ❌ | ✅ | ✅ |
| ifm-pwa | ❌ | ❌ | ❌ | ✅ | ✅ |
| IFM Station | ✅ | ✅ | ✅ | ❌ | ❌ |
| IFM Relay Station | ✅ | ✅ | ✅ | ❌ | ❌ |
| IFM Radio Listener | ✅ | ✅ | ✅ | ❌ | ❌ |
Documentation
- Build Pipeline — CI/CD, cross-compilation, signing
- Packaging — Binary formats, installers, containers
- Channels — Release channels, versioning, promotion
- Desktop Apps — Architecture & individual app docs
- Mobile PWA — Architecture & features