Skip to content

IFM Distribution

Goal: Make IFM trivial to install, run, and embed — everywhere.


Product Matrix

ProductTypeTargetPrimary Channel
ifm-cliBinaryNode operators, developersHomebrew, winget, apt, cargo, GitHub Releases
ifm-nodeBinary / ContainerServer operators, infraDocker Hub, GHCR, GitHub Releases, Linux packages
@ifm/sdknpm packageJS/TS app developersnpm (public), JSR
@ifm/sdk-wasmnpm + WASMBrowser apps, edge workersnpm, jsDelivr CDN
ifm-reactnpm packageReact developersnpm
ifm-vuenpm packageVue developersnpm
ifm-pythonPyPI packagePython developersPyPI
ifm-goGo moduleGo developerspkg.go.dev
libifmC shared libraryFFI, embedding, mobileGitHub Releases, system packages
ifm-androidAARAndroid appsMaven Central
ifm-iosXCFrameworkiOS/macOS appsGitHub Releases, CocoaPods, SPM
ifm-flutterPub packageFlutter/Dart appspub.dev
ifm-pwaPWA (WASM + Service Worker)Mobile listeners, audienceHTTPS (ifm.sh/pwa), GitHub Pages, CDN
IFM StationDesktop App (Tauri)Broadcasters, content creatorsGitHub Releases, Homebrew, winget, apt, scoop
IFM Relay StationDesktop App (Tauri)Mesh operators, infrastructureGitHub Releases, Homebrew, winget, apt, scoop
IFM Radio ListenerDesktop App (Tauri)End users, audienceGitHub Releases, Homebrew, winget, apt, scoop

Distribution Philosophy

  1. Zero-friction install — One command, no config, works immediately
  2. Platform-native — .deb/.rpm/.apk, .msi, .dmg, .pkg, Homebrew, winget, Scoop, Chocolatey
  3. Language-native — npm, PyPI, Cargo, Go, Maven, CocoaPods, SPM, pub.dev
  4. Container-first — Docker/OCI images for every service binary
  5. Verifiable — SLSA Level 3, cosign signatures, SBOMs, reproducible builds
  6. Auto-updatable — Built-in update checks, background updates for daemons

Release Cadence

ChannelFrequencyUse Case
NightlyEvery commit to mainEarly testing, CI integration
BetaEvery 2 weeksPre-release validation
StableEvery 6 weeks (or as needed)Production use
LTSAnnual, 2-year supportEnterprise, embedded

Versioning: SemVer (MAJOR.MINOR.PATCH)

  • MAJOR — Breaking protocol/API changes
  • MINOR — New features, backward compatible
  • PATCH — Bug fixes, security patches

Target Platforms

Tier 1 (Full Support, CI Tested)

PlatformArchifm-cliifm-node@ifm/sdklibifmifm-pwaDesktop Apps
Linuxx86_64
Linuxaarch64
Linuxarmv7
macOSx86_64
macOSarm64
Windowsx86_64
Windowsarm64
FreeBSDx86_64
Web (WASM)wasm32

Tier 2 (Community Maintained)

PlatformArchNotes
OpenBSDx86_64, arm64Ports tree
NetBSDx86_64, arm64pkgsrc
Illumosx86_64Tribblix, OmniOS
Androidarm64, x86_64NDK build
iOSarm64Xcode build
WASIwasm32wasmtime, wasmer

Installation Methods by Audience

End Users (CLI)

bash
# 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             # NixOS

Server Operators (Node)

bash
# 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-node

Desktop App Users

bash
# 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/Ubuntu

JavaScript/TypeScript Developers

bash
# 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/vue

Python Developers

bash
pip install ifm
# or
poetry add ifm
# or
uv add ifm

Go Developers

bash
go get github.com/ifmprotocol/ifm-go@v1.2.3

Rust Developers

bash
# Cargo (for embedding in Rust apps)
cargo add ifm-core

# Binary install
cargo install ifm-cli

Mobile Developers

bash
# 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_flutter

Mobile Listeners (PWA) — ifm-pwa

bash
# 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.png

Features:

  • 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

bash
# 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.gz

Release Artifacts

Every release publishes:

ArtifactFormatSignedSBOM
ifm-clitar.gz, .zip, .deb, .rpm, .apk, .msi, .pkg, .dmg✅ cosign✅ SPDX
ifm-nodetar.gz, Docker (multi-arch), .deb, .rpm✅ cosign✅ SPDX
@ifm/sdknpm tarball✅ npm attestation✅ SPDX
libifmtar.gz (headers + .so/.dylib/.dll + .a/.lib)✅ cosign✅ SPDX
Mobile.aar, .xcframework.zip✅ cosign✅ SPDX
ifm-pwaStatic 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
Sourcetar.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:

  1. Click "More info" on the SmartScreen warning
  2. 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 Output

releases/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.txt

Auto-Update

ProductMechanism
ifm-cliBuilt-in ifm update — checks GitHub Releases, verifies signature, replaces binary
ifm-node (daemon)systemd timer + ifm-node --self-update / Docker watchtower
@ifm/sdknpm outdated / Dependabot / Renovate
Docker imagesWatchtower, Diun, or docker pull ghcr.io/ifm/ifm-node:stable
ifm-pwaService Worker skipWaiting + clients.claim — updates on next load; optional navigator.serviceWorker.register().update() prompt
Desktop AppsTauri Updater — checks GitHub Releases, verifies cosign signature, downloads & installs

Support Matrix

ProductLinuxmacOSWindowsWebMobile
ifm-cli
ifm-node
@ifm/sdk
@ifm/sdk-wasm
ifm-pwa
IFM Station
IFM Relay Station
IFM Radio Listener

Documentation

Released under the MIT License.