angular-notifier, angular2-notifications, and ngx-toastr are libraries designed to display toast-style notifications in Angular applications. ngx-toastr is the most widely adopted port of the original toastr library, offering a lightweight and stable solution for standard alerts. angular-notifier is a modern, actively maintained fork of the original angular2-notifications, providing enhanced customization and current Angular version support. angular2-notifications is the legacy predecessor that is no longer maintained and should be avoided in new projects.
When building Angular applications, you need a reliable way to show feedback messages like success alerts or error warnings. angular-notifier, angular2-notifications, and ngx-toastr all solve this problem, but they differ significantly in maintenance status, API design, and customization options. Let's break down how they compare in real-world scenarios.
Choosing a library that is actively maintained is critical for security and compatibility with new Angular versions.
angular-notifier is actively maintained and regularly updated to support recent Angular releases.
// angular-notifier: Active maintenance
// npm install angular-notifier
// Supports Angular 15+ comfortably
import { NotifierModule } from 'angular-notifier';
angular2-notifications is legacy software and is no longer maintained.
// angular2-notifications: Legacy/Abandoned
// npm install angular2-notifications
// Not recommended for new projects
import { NotificationsModule } from 'angular2-notifications';
ngx-toastr is highly stable and maintained by a dedicated community.
// ngx-toastr: Stable and Standard
// npm install ngx-toastr
// Widely used in production apps
import { ToastrModule } from 'ngx-toastr';
The way you call the service to show a message differs slightly between packages, affecting how your code looks.
angular-notifier uses a generic notify method where you pass the type as a string.
// angular-notifier: Generic notify method
import { NotifierService } from 'angular-notifier';
constructor(private notifier: NotifierService) {}
showSuccess() {
this.notifier.notify('success', 'Operation completed');
}
angular2-notifications uses specific methods for each type like success or error.
// angular2-notifications: Specific methods
import { NotificationsService } from 'angular2-notifications';
constructor(private notify: NotificationsService) {}
showSuccess() {
this.notify.success('Title', 'Operation completed');
}
ngx-toastr also uses specific methods for each type, matching the original toastr library.
// ngx-toastr: Specific methods with title/message
import { ToastrService } from 'ngx-toastr';
constructor(private toastr: ToastrService) {}
showSuccess() {
this.toastr.success('Operation completed', 'Success');
}
How much control do you have over the look and feel of the notification?
angular-notifier allows you to create custom notification templates using Angular components.
// angular-notifier: Custom templates supported
// You can define custom UI components for notifications
NotifierModule.forRoot({
customTemplates: {
alert: CustomAlertComponent
}
});
angular2-notifications supports basic customization but lacks modern template flexibility.
// angular2-notifications: Basic CSS customization
// Limited ability to inject custom components
NotificationsModule.forRoot({
maxNotifications: 5
});
ngx-toastr focuses on configuration options rather than custom templates.
// ngx-toastr: Configuration based
// Easy to change position and time-to-close
ToastrModule.forRoot({
positionClass: 'toast-top-right',
timeOut: 3000
});
| Feature | angular-notifier | angular2-notifications | ngx-toastr |
|---|---|---|---|
| Status | ✅ Active | ❌ Legacy | ✅ Stable |
| API Style | Generic notify() | Specific success() | Specific success() |
| Custom UI | 🎨 High (Components) | 🎨 Low (CSS) | 🎨 Low (Config) |
| Best For | Custom Designs | Migration Only | Standard Toasts |
angular-notifier is like a custom builder kit 🧱 — perfect if you need notifications that look exactly like your brand and you want to ensure long-term support.
angular2-notifications is like an old blueprint 📜 — do not use it for new construction. Only relevant if you are maintaining an old app that hasn't been updated yet.
ngx-toastr is like a pre-fabricated unit 🏠 — ideal if you need something that works immediately with standard styles and minimal setup.
Final Thought: For most new projects, ngx-toastr offers the best balance of stability and ease of use. If you require deep UI customization, angular-notifier is the modern choice. Avoid angular2-notifications entirely.
Choose angular-notifier if you need deep customization of notification templates or require a library that is actively updated for the latest Angular versions. It is ideal for projects where the default toast look does not fit your design system and you need full control over the notification component structure.
Do not choose angular2-notifications for any new development as it is no longer maintained and lacks support for modern Angular versions. Existing projects using this library should plan a migration to angular-notifier or ngx-toastr to ensure security and compatibility.
Choose ngx-toastr if you want a proven, lightweight solution that works out of the box with minimal configuration. It is the best fit for standard admin dashboards or applications where default toast behaviors and styles are acceptable without heavy customization.
A well designed, fully animated, highly customizable, and easy-to-use notification library for your Angular 2+ application.
You can play around with this library with this Stackblitz right here.

You can get angular-notifier via npm by either adding it as a new dependency to your package.json file and running npm install,
or running the following command:
npm install angular-notifier
The following list describes the compatibility with Angular:
| Angular Notifier | Angular | Compilation |
|---|---|---|
1.x | 2.x | View Engine |
2.x | 4.x | View Engine |
3.x | 5.x | View Engine |
4.x | 6.x | View Engine |
5.x | 7.x | View Engine |
6.x | 8.x | View Engine |
7.x | 9.x | View Engine |
8.x | 10.x | View Engine |
9.x | 11.x | View Engine |
10.x | 12.x | View Engine |
11.x | 13.x | Ivy (partial mode) |
12.x | 14.x | Ivy (partial mode) |
13.x | 15.x | Ivy (partial mode) |
14.x | 16.x | Ivy (partial mode) |
Before actually being able to use the angular-notifier library within our code, we have to first set it up within Angular, and also bring the styles into our project.
NotifierModuleFirst of all, make angular-notifier globally available to your Angular application by importing (and optionally also configuring) the
NotifierModule the your root Angular module. For example:
import { NotifierModule } from 'angular-notifier';
@NgModule({
imports: [NotifierModule],
})
export class AppModule {}
But wait -- your probably might want to customize your notifications' look and behaviour according to your requirements and needs. To do so,
call the withConfig method on the NotifierModule, and pass in the options. For example:
import { NotifierModule } from 'angular-notifier';
@NgModule({
imports: [
NotifierModule.withConfig({
// Custom options in here
}),
],
})
export class AppModule {}
notifier-container componentIn addition, you have to place the notifier-container component somewhere in your application, best at the last element of your
root (app) component. For example:
@Component({
selector: 'my-app',
template: `
<h1>Hello World</h1>
<notifier-container></notifier-container>
`,
})
export class AppComponent {}
Later on, this component will contain and manage all your applications' notifications.
Of course we also need to import the angular-notifier styles into our application. Depending on the architecture of your Angular application, you want to either import the original SASS files, or the already compiled CSS files instead - or none of them if you wish to write your own styles from scratch.
To import all the styles, simple include either the ~/angular-notifier/styles.(scss|css) file. It contains the core styles as well as all
the themes and notification types.
To keep the size if your styles as small as possible (improving performance for the perfect UX), your might instead decide to only import the styles actually needed by our application. The angular-notifier styles are modular:
~/angular-notifier/styles/core.(scss|css) file is always required, it defines the basic styles (such as the layout)~/angular-notifier/styles/theme folder~/angular-notifier/styles/types folderUsing angular-notifier is as simple as it can get -- simple import and inject the NotifierService into every component (directive,
service, ...) you want to use in. For example:
import { NotifierService } from 'angular-notifier';
@Component({
// ...
})
export class MyAwesomeComponent {
private readonly notifier: NotifierService;
constructor(notifierService: NotifierService) {
this.notifier = notifierService;
}
}
Showing a notification is simple - all your need is a type, and a message to be displayed. For example:
this.notifier.notify('success', 'You are awesome! I mean it!');
You can further pass in a notification ID as the third (optional) argument. Essentially, such a notification ID is nothing more but a unique string tha can be used later on to gain access (and thus control) to this specific notification. For example:
this.notifier.notify('success', 'You are awesome! I mean it!', 'THAT_NOTIFICATION_ID');
For example, you might want to define a notification ID if you know that, at some point in the future, you will need to remove this exact notification.
The syntax above is actually just a shorthand version of the following:
this.notifier.show({
type: 'success',
message: 'You are awesome! I mean it!',
id: 'THAT_NOTIFICATION_ID', // Again, this is optional
});
You can also hide notifications. To hide a specific notification - assuming you've defined a notification ID when creating it, simply call:
this.notifier.hide('THAT_NOTIFICATION_ID');
Furthermore, your can hide the newest notification by calling:
this.notifier.hideNewest();
Or, your could hide the oldest notification:
this.notifier.hideOldest();
And, of course, it's also possible to hide all visible notifications at once:
this.notifier.hideAll();
From the beginning, the angular-notifier library has been written with customizability in mind. The idea is that angular-notifier works the way your want it to, so that you can make it blend perfectly into the rest of your application. Still, the default configuration should already provide a great User Experience.
Keep in mind that angular-notifier can be configured only once - which is at the time you import the
NotifierModuleinto your root (app) module.
With the position property you can define where exactly notifications will appear on the screen:
position: {
horizontal: {
/**
* Defines the horizontal position on the screen
* @type {'left' | 'middle' | 'right'}
*/
position: 'left',
/**
* Defines the horizontal distance to the screen edge (in px)
* @type {number}
*/
distance: 12
},
vertical: {
/**
* Defines the vertical position on the screen
* @type {'top' | 'bottom'}
*/
position: 'bottom',
/**
* Defines the vertical distance to the screen edge (in px)
* @type {number}
*/
distance: 12
/**
* Defines the vertical gap, existing between multiple notifications (in px)
* @type {number}
*/
gap: 10
}
}
With the theme property you can change the overall look and feel of your notifications:
/**
* Defines the notification theme, responsible for the Visual Design of notifications
* @type {string}
*/
theme: 'material';
Well, how does theming actually work? In the end, the value set for the theme property will be part of a class added to each notification
when being created. For example, using material as the theme results in all notifications getting a class assigned named x-notifier__notification--material.
Everyone - yes, I'm looking at you - can use this mechanism to write custom notification themes and apply them via the
themeproperty. For example on how to create a theme from scratch, just take a look at the themes coming along with this library (as for now only thematerialtheme).
With the behaviour property you can define how notifications will behave in different situations:
behaviour: {
/**
* Defines whether each notification will hide itself automatically after a timeout passes
* @type {number | false}
*/
autoHide: 5000,
/**
* Defines what happens when someone clicks on a notification
* @type {'hide' | false}
*/
onClick: false,
/**
* Defines what happens when someone hovers over a notification
* @type {'pauseAutoHide' | 'resetAutoHide' | false}
*/
onMouseover: 'pauseAutoHide',
/**
* Defines whether the dismiss button is visible or not
* @type {boolean}
*/
showDismissButton: true,
/**
* Defines whether multiple notification will be stacked, and how high the stack limit is
* @type {number | false}
*/
stacking: 4
}
If you need more control over how the inner HTML part of the notification looks like, either because your style-guide requires it, or for being able to add icons etc, then you can define a custom <ng-template> which you pass to the NotifierService.
You can define a custom ng-template as follows:
<ng-template #customNotification let-notificationData="notification">
<my-custom-alert type="notificationData.type"> {{ notificationData.message }} </my-custom-alert>
</ng-template>
In this case you could wrap your own HTML, even a <my-custom-alert> component which you might use in your application. The notification data is passed in as a notification object, which you can reference inside the <ng-template> using the let- syntax.
Inside your component, you can then reference the <ng-template> by its template variable #customNotification using Angular's ViewChild:
import { ViewChild } from '@angular/core';
@Component({
// ...
})
export class SomeComponent {
@ViewChild('customNotification', { static: true }) customNotificationTmpl;
constructor(private notifierService: NotifierService) {}
showNotification() {
this.notifier.show({
message: 'Hi there!',
type: 'info',
template: this.customNotificationTmpl,
});
}
}
With the animations property your can define whether and how exactly notification will be animated:
animations: {
/**
* Defines whether all (!) animations are enabled or disabled
* @type {boolean}
*/
enabled: true,
show: {
/**
* Defines the animation preset that will be used to animate a new notification in
* @type {'fade' | 'slide'}
*/
preset: 'slide',
/**
* Defines how long it will take to animate a new notification in (in ms)
* @type {number}
*/
speed: 300,
/**
* Defines which easing method will be used when animating a new notification in
* @type {'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'}
*/
easing: 'ease'
},
hide: {
/**
* Defines the animation preset that will be used to animate a new notification out
* @type {'fade' | 'slide'}
*/
preset: 'fade',
/**
* Defines how long it will take to animate a new notification out (in ms)
* @type {number}
*/
speed: 300,
/**
* Defines which easing method will be used when animating a new notification out
* @type {'linear' | 'ease' | 'ease-in' | 'ease-out' | 'ease-in-out'}
*/
easing: 'ease',
/**
* Defines the animation offset used when hiding multiple notifications at once (in ms)
* @type {number | false}
*/
offset: 50
},
shift: {
/**
* Defines how long it will take to shift a notification around (in ms)
* @type {number}
*/
speed: 300,
/**
* Defines which easing method will be used when shifting a notification around
* @type {string}
*/
easing: 'ease' // All standard CSS easing methods work
},
/**
* Defines the overall animation overlap, allowing for much smoother looking animations (in ms)
* @type {number | false}
*/
overlap: 150
}
To sum it up, the following is the default configuration (copy-paste-friendly):
const notifierDefaultOptions: NotifierOptions = {
position: {
horizontal: {
position: 'left',
distance: 12,
},
vertical: {
position: 'bottom',
distance: 12,
gap: 10,
},
},
theme: 'material',
behaviour: {
autoHide: 5000,
onClick: false,
onMouseover: 'pauseAutoHide',
showDismissButton: true,
stacking: 4,
},
animations: {
enabled: true,
show: {
preset: 'slide',
speed: 300,
easing: 'ease',
},
hide: {
preset: 'fade',
speed: 300,
easing: 'ease',
offset: 50,
},
shift: {
speed: 300,
easing: 'ease',
},
overlap: 150,
},
};