
Angular 22.1 introduces a major change to Angular’s release cycle, moving to one major release per year. Learn what this means for Angular upgrades, versioning, and the future of the framework.
Alain Chautard
August 18, 2026
Angular 22.1 landed on July 29th, 2026, and it’s a minor release. But it comes with an announcement that changes how all of us plan our upgrades: **Angular is switching to one major release per year.
Since Angular 4, we’ve had a major release every six months. That’s over, and here’s what it means concretely:
I’ve been teaching Angular upgrades for years now, and this is the change teams have been asking for.
The next release is v22.2, expected in September 2026.
Angular 22 introduced the new @Service() decorator, and the CLI has been generating services with it ever since. What was missing was a way to migrate the services already in your codebase. Angular v22.1 adds that schematic:
ng generate @angular/core:service
It converts this:
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class UserService {
// ...
}
Into this:
import { Service } from '@angular/core';
@Service()
export class UserService {
// ...
}
A bare @Injectable() becomes @Service().
The migration is conservative. It skips services that use constructor-based dependency injection, services passing options other than providedIn, and anything where providedIn isn't 'root'. Run it with the --dry-run option first to get an idea of how many files will get updated.
linkedSignal is what you reach for when you want a signal derived from another signal that you can also write to — something computed can't do:
readonly items = signal<Array<ItemModel>>([]);
protected readonly selectedItem = linkedSignal(() => this.items()[0]);
In v22.1, you can pass a custom set function to control what happens when you write to it:
protected readonly selectedItem = linkedSignal(() => this.items()[0], {
set: (item: ItemModel) => {
const items = this.items();
if (items.indexOf(item) < 0) {
this.items.set([item, ...items]);
}
}
});
Effects automatically track the signals they read, and that tracking used to extend into your HTTP interceptors. So an effect that triggered an HTTP request was silently depending on any signal your interceptors happened to read — an auth token signal, a locale signal, anything.
As of v22.1, interceptors run untracked. Your effects will now re-run only for the reasons you truly expect.
effect(() => {
const value = this.mySignal();
untracked(() => {
// do something with value
});
});
Devtools improvements Two small improvements in Angular DevTools:

Of course, and it should be painless if you’re already on Angular v22: ng update @angular/core @angular/cli
Get the latest news and updates on developer certifications. Content is updated regularly, so please make sure to bookmark this page or sign up to get the latest content directly in your inbox.

Component Architecture for React Server Components
React Server Components let each component fetch its own data, so pages compose instead of prop-drilling. How that reshapes architecture, loading boundaries, and UX.
Aurora Scharff
Aug 20, 2026

Background Jobs with Nitro Tasks API
How to run one-off and scheduled background work in Nuxt using Nitro's Tasks API, and what to watch for per deployment platform.
Reza Baar
Aug 19, 2026

What’s new in Angular 22.1?
Angular 22.1 introduces a major change to Angular’s release cycle, moving to one major release per year. Learn what this means for Angular upgrades, versioning, and the future of the framework.
Alain Chautard
Aug 18, 2026