ng add @angular/fire@canary looks up the canary tag, then installs and saves the range ^<that version>, and npm installs the highest version in that range. Since #3767 every canary is named 21.0.0-canary.*, which ranks below 21.0.0-rc.1, so the command installs the release candidate. The ng add setup step then saves 21.0.0-rc.1 as an exact version.
Details
- Today:
ng add @angular/fire@canary on an Angular 21 app installs 21.0.0-rc.1 and saves it exactly.
- After
21.0.0 ships: canaries are still named 21.0.0-canary.*, which rank below 21.0.0, so the same command installs 21.0.0.
npm install @angular/fire@canary installs the canary but saves ^<canary>, so a later install without the lockfile moves to the release candidate.
Workaround
Pass the exact canary version, from npm view @angular/fire@canary version, to ng add, for example ng add @angular/fire@21.0.0-canary.20260930011755.sha-59d44e7.
ng add @angular/fire@canarylooks up thecanarytag, then installs and saves the range^<that version>, and npm installs the highest version in that range. Since #3767 every canary is named21.0.0-canary.*, which ranks below21.0.0-rc.1, so the command installs the release candidate. Theng addsetup step then saves21.0.0-rc.1as an exact version.Details
ng add @angular/fire@canaryon an Angular 21 app installs21.0.0-rc.1and saves it exactly.21.0.0ships: canaries are still named21.0.0-canary.*, which rank below21.0.0, so the same command installs21.0.0.npm install @angular/fire@canaryinstalls the canary but saves^<canary>, so a later install without the lockfile moves to the release candidate.Workaround
Pass the exact canary version, from
npm view @angular/fire@canary version, tong add, for exampleng add @angular/fire@21.0.0-canary.20260930011755.sha-59d44e7.