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.0 → 2.0.0
MINORNew features, new APIs, new frequencies types, backward compatible1.2.0 → 1.3.0
PATCHBug fixes, security patches, performance improvements1.2.3 → 1.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. npm — npm 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.