Skip to content

IFM Release Channels

Versioning, promotion criteria, and release management for all IFM products.


Versioning Scheme

Semantic Versioning 2.0 (MAJOR.MINOR.PATCH)

ComponentWhen to IncrementExample
MAJORBreaking protocol changes, incompatible API, wire format changes1.0.02.0.0
MINORNew features, new APIs, new frequencies types, backward compatible1.2.01.3.0
PATCHBug fixes, security patches, performance improvements1.2.31.2.4

Pre-release identifiers (for non-stable channels):

  • 1.3.0-beta.1 — Beta release
  • 1.3.0-nightly.20241215 — Nightly build
  • 1.3.0-rc.1 — Release candidate

Channel Definitions

🌙 Nightly (nightly)

AspectDetails
TriggerEvery merge to main branch
VersionMAJOR.MINOR.PATCH-nightly.YYYYMMDD.HHMM (e.g., 1.3.0-nightly.20241215.0300)
ArtifactsAll Tier 1 targets
TestingUnit tests + integration tests (subset, ~15 min)
Signing✅ cosign (ephemeral key)
Retention30 days (auto-cleanup)
AudienceCI integration, early adopters, framework authors
Installcurl -fsSL https://ifm.sh/install-nightly.sh | bash
Dockerghcr.io/ifm/ifm-node:nightly
npm@ifm/sdk@nightly (dist-tag)

Promotion Criteria: None — automatic on merge.


🧪 Beta (beta)

AspectDetails
TriggerManual (Release Manager) — every 2 weeks from main
VersionMAJOR.MINOR.PATCH-beta.N (e.g., 1.3.0-beta.1)
ArtifactsAll Tier 1 + Tier 2 targets
TestingFull test suite + E2E + soak tests (2+ hours)
Signing✅ cosign (production key)
RetentionUntil next stable (or 3 betas)
AudiencePower users, plugin authors, early deployments
Installcurl -fsSL https://ifm.sh/install-beta.sh | bash
Dockerghcr.io/ifm/ifm-node:beta
npm@ifm/sdk@beta (dist-tag)

Promotion to Stable:

  • ✅ All CI passes (unit, integration, E2E, cross-platform)
  • ✅ No critical/regressions open
  • ✅ Performance benchmarks within 5% of previous stable
  • ✅ Security scan clean (no high/critical CVEs)
  • ✅ Documentation updated for new features
  • ✅ Migration guide published (if breaking changes)
  • ✅ Release Manager + 1 Core Maintainer approval

✅ Stable (stable, latest)

AspectDetails
TriggerManual (Release Manager) — every 6 weeks or as needed
VersionMAJOR.MINOR.PATCH (e.g., 1.3.0)
ArtifactsAll targets (Tier 1 + Tier 2 + mobile)
TestingFull suite + release validation + canary deploy
Signing✅ cosign (production key, hardware-backed)
RetentionPermanent
AudienceProduction, general public, package managers
Installcurl -fsSL https://ifm.sh/install.sh | bash (default)
Dockerghcr.io/ifm/ifm-node:stable, :latest, :v1.3.0
npm@ifm/sdk@latest (default dist-tag)

Promotion from Beta:

  • All Beta criteria +
  • ✅ 2-week soak in beta channel (or 1 week for patch)
  • ✅ Zero P0/P1 bugs reported in beta
  • ✅ Package manager PRs prepared (Homebrew, winget, etc.)
  • ✅ Changelog finalized
  • ✅ Blog post / release notes drafted
  • Unanimous Core Team approval

🏢 LTS (lts, lts-v1)

AspectDetails
TriggerAnnual — first stable of the year becomes LTS candidate
VersionMAJOR.MINOR.PATCH-lts.N (e.g., 1.2.5-lts.1)
BaseForked from stable branch (release/v1.x)
TestingFull suite + extended compatibility matrix
Support2 years from LTS designation
BackportsSecurity fixes only (no features)
AudienceEnterprise, embedded, regulated environments
Dockerghcr.io/ifm/ifm-node:lts, :lts-v1
npm@ifm/sdk@lts (dist-tag)

LTS Branches:

LTS Policy:

  • Only security fixes and critical bug fixes backported
  • New features → next MINOR on main
  • Maximum 1 PATCH per month (batched)
  • Announced 3 months before EOL

Channel Promotion Flow


Version Coordination Across Products

All IFM products in a release share the same version number:

ProductVersionNotes
ifm-cli1.3.0Binary
ifm-node1.3.0Binary + Docker
@ifm/sdk1.3.0npm
@ifm/sdk-wasm1.3.0npm
@ifm/react1.3.0npm
@ifm/vue1.3.0npm
ifm-python1.3.0PyPI
ifm-gov1.3.0Go module (prefix v)
libifm1.3.0C library
ifm-android1.3.0Maven (no v)
IFM (iOS)1.3.0CocoaPods/SPM
ifm_flutter1.3.0pub.dev
ifm-pwa1.3.0Static site (HTTPS/CDN)

Exception: Cargo packages use 1.3.0 (no v prefix), Go uses v1.3.0.


Release Branching Strategy

Rules:

  • main = always deployable (protected, requires PR + CI)
  • Nightly = auto from main
  • Beta = cut from main by Release Manager
  • Stable = cut from Beta branch (or main for patches)
  • Hotfixes = branch from target channel, PR back to main + channel

Release Checklist (Release Manager)

Pre-Release (T-1 week)

  • [ ] Create release branch (release/vX.Y.Z from beta/main)
  • [ ] Update CHANGELOG.md with all changes since last stable
  • [ ] Verify all CI pipelines green on release branch
  • [ ] Run full benchmark suite, compare to previous stable
  • [ ] Security scan (cargo audit, npm audit, osv-scanner)
  • [ ] Prepare package manager PRs (draft)

Release Day (T-0)

  • [ ] Tag release: git tag -s v1.3.0 -m "Release v1.3.0"
  • [ ] Push tag: git push origin v1.3.0
  • [ ] GitHub Actions release workflow triggers
  • [ ] Monitor build matrix (all targets)
  • [ ] Verify all artifacts published
  • [ ] Verify signatures + checksums
  • [ ] Publish npm packages (with provenance)
  • [ ] Publish Docker images (multi-arch)
  • [ ] Publish PyPI wheels
  • [ ] Publish Maven artifacts
  • [ ] Submit Homebrew PR
  • [ ] Submit winget PR
  • [ ] Submit Chocolatey/Scoop PRs
  • [ ] Update stable Docker tag
  • [ ] Update npm latest dist-tag
  • [ ] Update install.sh to point to new version

Post-Release (T+1 day)

  • [ ] Verify package manager merges
  • [ ] Publish release notes (GitHub + blog)
  • [ ] Announce on Discord, Twitter, mailing list
  • [ ] Monitor error tracking for regressions
  • [ ] Close release milestone

Rollback Procedure

If critical issue found post-release:

  1. Immediate — Push new patch tag (v1.3.1) with fix
  2. Docker — Retag stable to previous version: docker tag ifm-node:v1.2.5 ifm-node:stable
  3. npmnpm dist-tag add @ifm/sdk@1.2.5 latest
  4. Install script — Hotfix install.sh to point to previous version
  5. Communicate — Post incident report, timeline, root cause

Deprecation & Removal Schedule

VersionDeprecatedRemoved InMigration
1.3.0ifm tune --legacy flag2.0.0Use ifm tune <freq>
1.2.0PacketType::Raw enum2.0.0Use PacketType::Plugin
1.0.0Frequency::parse_v0()2.0.0Use Frequency::parse()

Policy: Minimum 3 stable releases (18 weeks) between deprecation and removal.


Channel-Specific Install URLs

ChannelInstall ScriptDocker Tagnpm Dist-Tag
Nightlyinstall-nightly.sh:nightly@nightly
Betainstall-beta.sh:beta@beta
Stableinstall.sh:stable, :latest@latest
LTSinstall-lts.sh:lts@lts

All scripts at: https://ifm.sh/install-<channel>.sh

Released under the MIT License.