2017-05-20 21:25:26 +10:00
# Notification
> Create OS desktop notifications
Process: [Main ](../glossary.md#main-process )
2025-06-10 01:00:06 -07:00
> [!NOTE]
> If you want to show notifications from a renderer process you should use the
> [web Notifications API](../tutorial/notifications.md)
2017-05-20 21:25:26 +10:00
2026-03-05 11:57:19 -08:00
> [!NOTE]
> On MacOS, notifications use the UNNotification API as their underlying framework.
> This API requires an application to be code-signed in order for notifications
> to appear. Unsigned binaries will emit a `failed` event when notifications
> are called.
2017-05-20 21:25:26 +10:00
## Class: Notification
> Create OS desktop notifications
Process: [Main ](../glossary.md#main-process )
2019-07-22 08:20:43 -07:00
`Notification` is an [EventEmitter][event-emitter].
2017-05-20 21:25:26 +10:00
It creates a new `Notification` with native properties as set by the `options` .
2017-05-30 20:27:24 +10:00
2025-06-10 01:00:06 -07:00
> [!WARNING]
> Electron's built-in classes cannot be subclassed in user code.
> For more information, see [the FAQ](../faq.md#class-inheritance-does-not-work-with-electron-built-in-modules).
2017-05-30 20:27:24 +10:00
### Static Methods
The `Notification` class has the following static methods:
2017-06-23 20:50:50 +10:00
#### `Notification.isSupported()`
2017-05-30 20:27:24 +10:00
2021-11-16 05:13:18 +01:00
Returns `boolean` - Whether or not desktop notifications are supported on the current system
2017-05-20 21:25:26 +10:00
2026-03-05 14:30:04 -08:00
#### `Notification.handleActivation(callback)` _Windows_
* `callback` Function
* `details` [ActivationArguments ](structures/activation-arguments.md ) - Details about the notification activation.
Registers a callback to handle all notification activations. The callback is invoked whenever a
notification is clicked, replied to, or has an action button pressed - regardless of whether
the original `Notification` object is still in memory.
This method handles timing automatically:
* If an activation already occurred before calling this method, the callback is invoked immediately
with those details.
* For all subsequent activations, the callback is invoked when they occur.
The callback remains registered until replaced by another call to `handleActivation` .
This provides a centralized way to handle notification interactions that works in all scenarios:
* Cold start (app launched from notification click)
* Notifications persisted in AC that have no in-memory representation after app re-start
* Notification object was garbage collected
* Notification object is still in memory (callback is invoked in addition to instance events)
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
// Register handler for all notification activations
Notification.handleActivation((details) => {
console.log('Notification activated:', details.type)
if (details.type === 'reply') {
console.log('User reply:', details.reply)
} else if (details.type === 'action') {
console.log('Action index:', details.actionIndex)
}
})
})
```
2020-04-02 09:32:18 -07:00
### `new Notification([options])`
2017-05-20 21:25:26 +10:00
2019-06-04 14:03:24 -07:00
* `options` Object (optional)
2023-03-21 18:40:43 -07:00
* `title` string (optional) - A title for the notification, which will be displayed at the top of the notification window when it is shown.
2021-11-16 05:13:18 +01:00
* `subtitle` string (optional) _ macOS _ - A subtitle for the notification, which will be displayed below the title.
* `body` string (optional) - The body text of the notification, which will be displayed below the title or subtitle.
2023-03-21 18:40:43 -07:00
* `silent` boolean (optional) - Whether or not to suppress the OS notification noise when showing the notification.
2024-08-22 02:38:06 +02:00
* `icon` (string | [NativeImage ](native-image.md )) (optional) - An icon to use in the notification. If a string is passed, it must be a valid path to a local icon file.
2021-11-16 05:13:18 +01:00
* `hasReply` boolean (optional) _ macOS _ - Whether or not to add an inline reply option to the notification.
* `timeoutType` string (optional) _ Linux _ _ Windows _ - The timeout duration of the notification. Can be 'default' or 'never'.
* `replyPlaceholder` string (optional) _ macOS _ - The placeholder to write in the inline reply input field.
* `sound` string (optional) _ macOS _ - The name of the sound file to play when the notification is shown.
* `urgency` string (optional) _ Linux _ - The urgency level of the notification. Can be 'normal', 'critical', or 'low'.
2017-11-29 11:58:24 +01:00
* `actions` [NotificationAction[]](structures/notification-action.md) (optional) _ macOS _ - Actions to add to the notification. Please read the available actions and limitations in the `NotificationAction` documentation.
2021-11-16 05:13:18 +01:00
* `closeButtonText` string (optional) _ macOS _ - A custom title for the close button of an alert. An empty string will cause the default localized text to be used.
* `toastXml` string (optional) _ Windows _ - A custom description of the Notification on Windows superseding all properties above. Provides full customization of design and behavior of the notification.
2017-05-20 21:25:26 +10:00
### Instance Events
Objects created with `new Notification` emit the following events:
2023-03-21 18:40:43 -07:00
:::info
Some events are only available on specific operating systems and are labeled as such.
:::
2017-05-20 21:25:26 +10:00
2017-05-29 21:33:43 +10:00
#### Event: 'show'
2017-05-20 21:25:26 +10:00
Returns:
* `event` Event
2023-03-21 18:40:43 -07:00
Emitted when the notification is shown to the user. Note that this event can be fired
2017-05-29 21:33:43 +10:00
multiple times as a notification can be shown multiple times through the
`show()` method.
2017-05-20 21:25:26 +10:00
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Title!',
subtitle: 'Subtitle!',
body: 'Body!'
})
n.on('show', () => console.log('Notification shown!'))
n.show()
})
```
2017-05-29 21:33:43 +10:00
#### Event: 'click'
2017-05-20 21:25:26 +10:00
Returns:
* `event` Event
2017-05-29 21:33:43 +10:00
Emitted when the notification is clicked by the user.
2017-05-20 21:25:26 +10:00
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Title!',
subtitle: 'Subtitle!',
body: 'Body!'
})
n.on('click', () => console.log('Notification clicked!'))
n.show()
})
```
2017-05-29 21:33:43 +10:00
#### Event: 'close'
2017-05-20 21:25:26 +10:00
Returns:
2026-03-02 17:38:51 +01:00
* `details` Event\<\>
* `reason` _ Windows _ string (optional) - The reason the notification was closed. This can be 'userCanceled', 'applicationHidden', or 'timedOut'.
2017-05-20 21:25:26 +10:00
2017-05-29 21:33:43 +10:00
Emitted when the notification is closed by manual intervention from the user.
2017-10-23 22:37:03 -07:00
This event is not guaranteed to be emitted in all cases where the notification
2017-05-29 21:33:43 +10:00
is closed.
2017-05-20 21:25:26 +10:00
2023-10-18 01:33:00 +02:00
On Windows, the `close` event can be emitted in one of three ways: programmatic dismissal with `notification.close()` , by the user closing the notification, or via system timeout. If a notification is in the Action Center after the initial `close` event is emitted, a call to `notification.close()` will remove the notification from the action center but the `close` event will not be emitted again.
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Title!',
subtitle: 'Subtitle!',
body: 'Body!'
})
n.on('close', () => console.log('Notification closed!'))
n.show()
})
```
#### Event: 'reply' _macOS_ _Windows_
2017-05-20 21:25:26 +10:00
Returns:
2026-02-12 23:25:20 +01:00
* `details` Event\<\>
* `reply` string - The string the user entered into the inline reply field.
* `reply` string _ Deprecated _
2017-05-20 21:25:26 +10:00
Emitted when the user clicks the "Reply" button on a notification with `hasReply: true` .
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Send a Message',
body: 'Body Text',
hasReply: true,
replyPlaceholder: 'Message text...'
})
n.on('reply', (e, reply) => console.log(`User replied: ${reply}` ))
n.on('click', () => console.log('Notification clicked'))
n.show()
})
```
#### Event: 'action' _macOS_ _Windows_
2017-06-23 20:39:42 +10:00
Returns:
2026-02-12 23:25:20 +01:00
* `details` Event\<\>
* `actionIndex` number - The index of the action that was activated.
* `selectionIndex` number _ Windows _ - The index of the selected item, if one was chosen. -1 if none was chosen.
* `actionIndex` number _ Deprecated _
* `selectionIndex` number _ Windows _ _ Deprecated _
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const items = ['One', 'Two', 'Three']
const n = new Notification({
title: 'Choose an Action!',
actions: [
{ type: 'button', text: 'Action 1' },
{ type: 'button', text: 'Action 2' },
{ type: 'selection', text: 'Apply', items }
]
})
n.on('click', () => console.log('Notification clicked'))
n.on('action', (e) => {
console.log(`User triggered action at index: ${e.actionIndex}` )
if (e.selectionIndex > -1) {
console.log(`User chose selection item '${items[e.selectionIndex]}'` )
}
})
n.show()
})
```
2017-06-23 20:39:42 +10:00
2020-09-29 12:20:10 -07:00
#### Event: 'failed' _Windows_
Returns:
* `event` Event
2021-11-16 05:13:18 +01:00
* `error` string - The error encountered during execution of the `show()` method.
2020-09-29 12:20:10 -07:00
Emitted when an error is encountered while creating and showing the native notification.
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Bad Action'
})
n.on('failed', (e, err) => {
console.log('Notification failed: ', err)
})
n.show()
})
```
2017-05-20 21:25:26 +10:00
### Instance Methods
2023-03-21 18:40:43 -07:00
Objects created with the `new Notification()` constructor have the following instance methods:
2017-05-20 21:25:26 +10:00
#### `notification.show()`
2023-03-21 18:40:43 -07:00
Immediately shows the notification to the user. Unlike the web notification API,
instantiating a `new Notification()` does not immediately show it to the user. Instead, you need to
call this method before the OS will display it.
2017-08-21 13:53:50 -07:00
2017-10-27 12:17:30 -07:00
If the notification has been shown before, this method will dismiss the previously
shown notification and create a new one with identical properties.
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Title!',
subtitle: 'Subtitle!',
body: 'Body!'
})
n.show()
})
```
2017-10-27 16:22:21 +13:00
#### `notification.close()`
2017-10-27 12:17:30 -07:00
Dismisses the notification.
2017-10-27 16:22:21 +13:00
2023-10-18 01:33:00 +02:00
On Windows, calling `notification.close()` while the notification is visible on screen will dismiss the notification and remove it from the Action Center. If `notification.close()` is called after the notification is no longer visible on screen, calling `notification.close()` will try remove it from the Action Center.
2026-02-12 23:25:20 +01:00
```js
const { Notification, app } = require('electron')
app.whenReady().then(() => {
const n = new Notification({
title: 'Title!',
subtitle: 'Subtitle!',
body: 'Body!'
})
n.show()
setTimeout(() => n.close(), 5000)
})
```
2019-07-24 17:18:11 -07:00
### Instance Properties
#### `notification.title`
2021-11-16 05:13:18 +01:00
A `string` property representing the title of the notification.
2019-07-24 17:18:11 -07:00
#### `notification.subtitle`
2021-11-16 05:13:18 +01:00
A `string` property representing the subtitle of the notification.
2019-07-24 17:18:11 -07:00
#### `notification.body`
2021-11-16 05:13:18 +01:00
A `string` property representing the body of the notification.
2019-07-24 17:18:11 -07:00
#### `notification.replyPlaceholder`
2021-11-16 05:13:18 +01:00
A `string` property representing the reply placeholder of the notification.
2019-07-24 17:18:11 -07:00
#### `notification.sound`
2021-11-16 05:13:18 +01:00
A `string` property representing the sound of the notification.
2019-07-24 17:18:11 -07:00
#### `notification.closeButtonText`
2021-11-16 05:13:18 +01:00
A `string` property representing the close button text of the notification.
2019-07-24 17:18:11 -07:00
#### `notification.silent`
2021-11-16 05:13:18 +01:00
A `boolean` property representing whether the notification is silent.
2019-07-24 17:18:11 -07:00
#### `notification.hasReply`
2021-11-16 05:13:18 +01:00
A `boolean` property representing whether the notification has a reply action.
2019-07-24 17:18:11 -07:00
2019-09-18 22:35:20 -07:00
#### `notification.urgency` _Linux_
2021-11-16 05:13:18 +01:00
A `string` property representing the urgency level of the notification. Can be 'normal', 'critical', or 'low'.
2019-09-18 22:35:20 -07:00
2023-03-20 07:25:54 -07:00
Default is 'low' - see [NotifyUrgency ](https://developer-old.gnome.org/notification-spec/#urgency-levels ) for more information.
2019-09-18 22:35:20 -07:00
2019-10-09 17:22:21 +02:00
#### `notification.timeoutType` _Linux_ _Windows_
2021-11-16 05:13:18 +01:00
A `string` property representing the type of timeout duration for the notification. Can be 'default' or 'never'.
2019-10-09 17:22:21 +02:00
If `timeoutType` is set to 'never', the notification never expires. It stays open until closed by the calling API or the user.
2019-07-24 17:18:11 -07:00
#### `notification.actions`
A [`NotificationAction[]` ](structures/notification-action.md) property representing the actions of the notification.
2020-09-29 12:20:10 -07:00
#### `notification.toastXml` _Windows_
2021-11-16 05:13:18 +01:00
A `string` property representing the custom Toast XML of the notification.
2020-09-29 12:20:10 -07:00
2017-08-21 13:56:10 -07:00
### Playing Sounds
2017-08-21 13:53:50 -07:00
On macOS, you can specify the name of the sound you'd like to play when the
notification is shown. Any of the default sounds (under System Preferences >
Sound) can be used, in addition to custom sound files. Be sure that the sound
2017-08-21 13:56:10 -07:00
file is copied under the app bundle (e.g., `YourApp.app/Contents/Resources` ),
or one of the following locations:
2017-08-21 13:53:50 -07:00
* `~/Library/Sounds`
* `/Library/Sounds`
* `/Network/Library/Sounds`
* `/System/Library/Sounds`
See the [`NSSound` ](https://developer.apple.com/documentation/appkit/nssound ) docs for more information.
2019-07-22 08:20:43 -07:00
[event-emitter]: https://nodejs.org/api/events.html#events_class_eventemitter