đ„ The open-source notification infrastructure with fully functional embedded notification center đđđ
TL;DR: All you need to know about the latest Novu 0.24.0 release. Translation management improvements, notifire package deprecations, template editing preview updates, workflow pagination, and more!
We're excited to highlight the newest features introduced in our latest release. Join us as we explore the treasure that was recovered from the depths of the engineers' dungeon!
Weâve made significant enhancements to the Translation management feature.
đĄÂ Note: This feature is only available for Novu Cloud for Business and Enterprise Clients.
As of this release we will be deprecating the original Notifire packages hosted on GitHub and any package within the @notifire
namespace on NPM.
Users should promptly transition to the official @novu
packages and platform.
notifire/ws
)
notifire/widget
)
notifire/sdk
)
notifire/web
)
notifire/api
)
We've implemented enhanced pagination on the Workflows page, allowing for easier navigation between pages, displaying more items, and direct access to specific pages.
Previously, deleted subscribers remained part of the topics they were added to. Now, they are automatically removed from any topics they were part of upon deletion.
PR for Reference: https://github.com/novuhq/novu/pull/5187
There was a known reported bug where a subscriber filter on a digest step fails because subscriber details always appeared to be null when evaluating filters on digests.
The bug has been resolved, and subscriber details are now consistently available for digest filters.
PR for Reference: https://github.com/novuhq/novu/pull/5234
Full Changelog: https://github.com/novuhq/novu/compare/v0.23.0...v0.24.0
TL;DR: All you need to know about the latest Novu 0.23.0 release. Translation management, provider integrations, notification center updates, performance updates, and more!
We're excited to highlight the newest features introduced in our latest release. Join us as we explore what awaits you!
đĄNote: This feature is only available for Novu Cloud for Business and Enterprise Clients.
The translation management feature allows users to create, upload, and edit translation groups and files from the Novu dashboard.
Itâs new and weâre excited for you to start using it in your apps!
With this feature comes a new handlebar helper for translations, {{ i18n ... }}
. Novu users can now translate their notification templates to different languages using the i18n
handlebar helper and the translation keys in the editor.
In our continued effort to enhance security and compatibility in enterprise environments, we are proud to announce a significant update aimed at supporting systems with restricted root access.
Key Features:
Getting Started:
No action is required from your side to take advantage of this update. The changes have been seamlessly integrated into Novu, ensuring that your enterprise deployments comply with non-root user policies without any additional configuration needed.
We're thrilled to share that Novu has officially introduced support for ARM images, marking a significant step in our dedication to embracing innovation and responsibility within the tech landscape. This development ensures that Novu stays ahead in the realm of notification infrastructure by broadening our platform's accessibility, compatibility, and sustainability.
Key Highlights:
Getting Started with ARM Images:
To use Novu on an ARM-based system, simply pull the ARM-compatible Docker image from our registry. If you are on a not a ARM based system you can use the following command in docker to pull the image.
docker pull --platform linux/arm64 ghcr.io/novuhq/novu:v0.23.0
đĄNote: Emulating ARM hardware may be slower then running an ARM image on ARM hardware.
Novu has evolved so much from when it was originally created. On the release of v0.24.0, we will be deprecating the original Notifire packages hosted on GitHub and any package within the @notifire
namespace on NPM.
The following packages hosted on GitHub under the novuhq
organization are scheduled for deprecation:
notifire/ws
)
notifire/widget
)
notifire/sdk
)
notifire/web
)
notifire/api
)
All packages within the @notifire namespace on NPM are also scheduled for deprecation. This includes any package prefixed with @notifire/
, ensuring a comprehensive and clear transition away from these older offerings.
Users currently relying on these deprecated packages should promptly transition to the official @novu
packages.
We're security conscious at Novu. The API keys are now encrypted at rest in the database and hashed at rest in the cache.
We added this security feature to prevent direct use of the API key in the event of a database breach or bad actor trying to use the key with bad intentions.
Note: All existing API keys become encrypted through a data migration script for self-hosted users. Running the script more than once does not re-encrypt the api keys.
Users can now remove multiple notifications using an array of message ids (limit of 100) via the Notification center hooks and Headless library.
Notification Center Hook
const onSuccess = (data: IMessage) => {};
const onError = (error: Error) => {};
const { removeNotifications, isLoading, isError, error } = useRemoveNotifications({
onSuccess,
onError,
});
Headless Service
headlessService.removeNotifications({
listener: (
result: UpdateResult<IMessage, unknown, { messageId: string }>
) => {
console.log(result);
},
onSuccess: (message: IMessage) => {
console.log(message);
},
onError: (error: unknown) => {
console.error(error);
},
messageIds: ["message_id_1", "message_id_2" ],
});
You can now send Chat messages via the Rocket Chat provider integration:
You can now send SMS messages via the Brevo SMS provider integration:
You can now send SMS via the iSend sms provider integration:
A customData
overrides provider for SMS now exists. This property allows us to support provider specific configurations in future for SMS providers.
For now, it only supports DLT (Distributed Ledger Technology) for the Gupshup SMS provider.
Trigger workflow with customData
novu.trigger("gupshup-workflow", {
to: {
subscriberId: "1234",
},
payload: {
user: "Viraj",
},
overrides: {
sms: {
customData: {
principalEntityId: "principal entity Id",
dltTemplateId: "dlt template Id",
},
},
},
});
We've made a little adjustment to the workflow email editor to enhance user experience by including auto-suggestions while adding variables.
This feature greatly minimizes the chance of selecting the wrong variable and having incorrect template content.
Full Changelog: https://github.com/novuhq/novu/compare/v0.22.0...v0.23.0
TL;DR: All you need to know about the latest Novu 0.22.0 release. Multi-tenancy Variants, API Idempotency, API Rate Limiting, Filter conditional variables and more!
We're excited to highlight the newest features introduced in our latest release. Join us as we explore what awaits you!
Variants is an integral component of our multi-tenancy feature and aims to empower users to create multiple variants for a given workflow step, such as the Email step. These step variations are linked to specific conditions.
Within the multi-tenancy context, these conditions may pertain to tenants; for instance, if the tenant is named "Nike", a specific email variant will be chosen.
However, these conditions extend beyond tenants, allowing users to base their criteria on the trigger payload, subscriber data, or webhook data.
During the notification sending phase, the systemâs logic will determine the appropriate variant based on the contextual information that was passed with the trigger event and the conditions applied to the variants. Only a single variant will be selected and sent to the user at the end.
Note: We have renamed the Filters functionality to Conditions.
Adding a variant to email step
In this gif above, we added a variant to our email step, thus making us have the root variant (with no condition) that will be sent if there's no tenant identifier specified, and a variant that will be sent if the tenant identifier is Nike.
To enhance the resilience and dependability of our API system, especially during disruptive scenarios like network interruptions, we have introduced the Idempotency headers to POST and PATCH HTTP methods within the API.
We have now granted users the ability to include Idempotency headers in their requests. A given operation will not be executed more than once, even if users resubmit the request following a perceived failure.
This guarantees that we process changes in a fail-safe manner, and the system caches the response for a day for future reference. This approach ensures that only valid and unique changes are processed, contributing to the overall robustness and reliability of our API system.
Note: Currently, the Idempotency headers are not enabled on the Novu cloud but functionality is available for self-hosting. We are currently integrating it into all of our SDKs as well.
Huge shoutout to @mahendraHegde for bringing in the Idempotency feature and to @michaldziuba03 for implementing the exponential retry mechanism in Node SDK! Your contribution rocks, much appreciated! đ
PRs:
Rate limiting is an essential functionality for establishing a robust and resilient system. It safeguards system resources from being misused by malicious actors or being monopolized by one client.
It plays a vital role in sustaining consistent system performance by regulating traffic and preventing sudden increases that could degrade service quality.
Note: It's not currently enabled on Novu Cloud yet. We'll inform all users whenever we want to enable this option for all cloud users. If you're self-hosting, you can enable API rate limiting immediately with the IS_API_RATE_LIMITING_ENABLED
flag in the environment variable.
PRs:
The condition Value
field now supports the use of variables as its value, enhancing the dynamic nature of this functionality.
PRs:
The workflow settings override functionality allows to update the active
and channel
preferences fields on the workflow per tenant.
A good use case for this is the ability to have the following setting preferences enabled for all users, but you want them disabled for specific tenants. For example, you have about 3 tenants: Nike, Cloudinary and Eden. You can create a new settings override by passing the tenantId
and workflowId
, and your preferences.
We have implemented the set of the API endpoints that allow the following:
Create new workflow settings overrides
Update workflow settings overrides
PRs:
Note: We are currently working on ensuring our SDKs have support for this functionality.
We have added a new API endpoint that allows the cancellation of any event from the digest.
Note: We are currently updating all of our SDKs to support this new functionality.
PRs:
We have done some performance plumbing to improve the speed & resilience of the overall system. Our goal is to keep working on performance, reliability and resilience in every release.
You can now send SMS messages using custom SMS providers using REST API. Do this by setting up the Generic SMS provider:
You can now send SMS messages via the MessageBird SMS provider integration:
You can now send SMS messages via the BulkSMS SMS provider integration:
You can now send SMS messages via the SimpleTexting SMS provider integration:
You can now send SMS messages via the Azure SMS provider integration:
You can now send emails via the Braze Email provider integration:
You can now send messages via the Pusher Beams provider integration:
You can now send messages via the Grafana On Call webhook chat provider integration:
pr-labeler.yml
workflow by @rannn505 in https://github.com/novuhq/novu/pull/4752
Full Changelog: https://github.com/novuhq/novu/compare/v0.21.0...v0.22.0
TL;DR: All you need to know about the latest Novu 0.21.0 release. Removal of the multi-providers
feature flag, @novu/notification-center-angular
package now supports Angular projects of version 15 and higher, new Actor
system variables, Brand Logo Management, Organization APIs and more.
We're thrilled to announce the newest features in our most recent release. Let's get started and explore what's waiting for you!
multi-providers
Feature FlagIn this release, we are excited to announce the removal of the multi-providers
feature flag. This feature was previously disabled by default to ensure backward compatibility.
To upgrade to this new version, you will need to follow these steps:
Run Migration Script for Creating primary
and priority
Fields: You can access the migration script for creating primary
and priority
fields by clicking here.
// apps/api/package.json
"migration": "cross-env NODE_ENV=local MIGRATION=true ts-node --transpileOnly ./migrations/integration-scheme-update/add-primary-priority-migration.ts",
cd apps/api
npm run migration
Run Migration Script for Updating Novu Integrations: To update Novu integrations, you'll need to execute the migration script available here.
// apps/api/package.json
"migration": "cross-env NODE_ENV=local MIGRATION=true ts-node --transpileOnly ./migrations/integration-scheme-update/update-primary-for-disabled-novu-integrations.ts",
cd apps/api
npm run migration
By following these steps, you can smoothly upgrade to the latest version of our software and enjoy the benefits of the multi-providers
feature flag removal. If you encounter any issues during the upgrade process, please don't hesitate to reach out to our support team for assistance.
PR Details:
chore(web): Remove multi-provider feature flag by @rifont in https://github.com/novuhq/novu/pull/4402
Starting with this release, the @novu/notification-center-angular
package now supports Angular projects of version 15 and higher.
Previously, it had a limitation only for Angular version 15.
PR Details:
feat(notification-center-angular): Support Angular versions 15+ by @rifont in https://github.com/novuhq/novu/pull/4518
In this release, we've introduced a new Actor
system variables.
These system variables can now be utilized within any channel editor, enhancing flexibility and customization.
actor
system variables in your channel editors.actor
information.This addition lets you incorporate dynamic actor information in your channel configurations, making your workflows more versatile and adaptable.
PR Details:
feat: add actor
to system variables by @ainouzgali in https://github.com/novuhq/novu/pull/4278
This release introduces a new functionality that allows you to update or remove your brand logo seamlessly.
These brand logo management capabilities give you greater control over your application's visual identity. Customize your branding effortlessly and tailor it to your specific needs.
PR Details:
feat: add ability to remove uploaded brand logo by @michaldziuba03 in https://github.com/novuhq/novu/pull/4451
We are excited to introduce a new integration with Pushpad in this release.
You can learn more about this provider here.
PR Details:
In this release, we've introduced a significant enhancement - the Organization APIs. You can now harness the power of these APIs to manage their organizations efficiently, handle member listings, removals, and even update branding seamlessly.
POST /invites
, simplifying the process of expanding your organization.PR Details:
Full Changelog: https://github.com/novuhq/novu/compare/v0.20.0...v0.21.0
TL;DR: All you need to know about the latest Novu 0.20.0 release. Global User Preferences, Integrations conditions, Digest and delay filters and more!
We're thrilled to announce the newest features in our most recent release. Let's get started and explore what's waiting for you!
It's now possible to set subscriber preferences globally for either a particular channel or all channels via API.
I'm really stoked about this because before now it was only available per workflow, /:subscriberId/preferences/:templateId
With these API URLs, you can fetch and update global subscriber preferences.
PATCH /subscribers/:subscriberid/preference
- Update a subscriber preference globally.GET /subscribers/:subscriberid/preferences/global
- Fetch a subscriber preference globally.Note: These methods are also available in the NodeJS SDK. They will be available in other language SDKs very soon.
If you're using the Headless service and Notification Center Widgets, you can set or fetch via the following APIs:
widgets/preferences
- PATCH : Update subscriber preferences globally{
"enabled": true,
"preferences": [
{
"type": "in_app",
"enabled": true
},
{
"type": "email",
"enabled": false
}
]
}
widgets/preferences/global
- GET : Fetch subscriber preferences globally.The exposed methods from the widgets are:
fetchUserGlobalPrereferences
updateUserGlobalPreferences
Note: If a workflow is marked as critical, the subscriber global preferences will be ignored, and notifications will be sent.
Users can now add filters to the digest and delay nodes inside the workflow editor to dynamically control if a digest should be used or not.
Digest Node: Adding filter
Delay Node: Adding filter
We have improved the error icons and states for each node in the workflow, when no provider is connected or not configured.
We now support adding custom data in email overrides as shown below:
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_API_KEY>');
await novu.subscribers.trigger("workflowIdentifier", {
to: "subscriberId",
payload: {
customKey: "customValue",
},
overrides: {
email: {
from: "[email protected]",
// customData will work only for sendgrid
customData: {
"customKey": "customValue"
}
}
}
}
Email Custom Data overrides
Note: This works for Sendgrid only at the moment.
You can override sms values via the code below.
...
...
await novu.subscribers.trigger("workflowIdentifier", {
to: "subscriberId",
payload: {
customKey: "customValue",
},
overrides: {
sms: {
to: "<insert-phone-number>",
content: "<insert-content>"
}
}
}
SMS Overrides
Users can now create conditions for the channel integrations to be executed for specific tenants only.
In the image above, you can add the condition (to an integration) to state that the integration should be used if the tenant identifier used in trigger matches the tenant identifier set here.
Note: The integrations are the provider instances on the Integration store dashboard.
When Novu runs a trigger code with a tenant Identifier attached to it like so:
import { Novu } from '@novu/node';
const novu = new Novu(process.env.NOVU_API_KEY);
await novu.trigger('<WORKFLOW_TRIGGER_ID>',
{
to: {
subscriberId: '<UNIQUE_SUBSCRIBER_IDENTIFIER>',
email: '[email protected]',
},
tenant: "tenantIdentifier"
}
);
..Novu runs checks on the integrations in the Integration store to determine which integration matches to be used to send the notification based on any condition that has been set. If nothing was set, it defaults to the primary provider set for the channel used in the workflow.
Now, you can use the Mailtrap Email provider on Novu.
Now, you can use the Clicksend SMS provider on Novu.
Full Changelog: https://github.com/novuhq/novu/compare/v0.19.0...v0.20.0
TL;DR: All you need to know about the latest Novu 0.19.0 release. Multi-tenancy management, bulk subscriber creation, override layouts and more!
We're eager to showcase the latest features in our most recent release. Let's dive in and discover what's in store for you!
We are stoked to let you know that you can now manage tenants from the UI (Novuâs dashboard) and the API.
Self-hosted users need to add and turn on the IS_MULTI_TENANCY_ENABLED
env flag to be able to manage tenants in their Novu installation.
With tenants feature now generally available, there are different ways youâll be able to use it in your app depending on your use case.
One of those ways is using it as variables in your workflows and triggers. When triggering a notification using the events trigger endpoint, you can pass in a tenant property as a parameter like so:
import { Novu } from '@novu/node';
const novu = new Novu(process.env.NOVU_API_KEY);
await novu.trigger('<WORKFLOW_TRIGGER_ID>',
{
to: {
subscriberId: '<UNIQUE_SUBSCRIBER_IDENTIFIER>',
email: '[email protected]',
firstName: 'John',
lastName: 'Doe',
},
payload: {
name: "Hello World",
organization: {
logo: 'https://happycorp.com/logo.png',
},
},
actor: "actorId"
tenant: "tenantIdentifier"
}
);
passing in tenant property when triggering a notification
The tenant can also be accessed in a workflow template like so:
{{ tenant.data.logo }}
accessing tenant properties in a workflow
This release also ships the wildly requested âbulk subscriber creation.â Starting v0.19, youâll be able to create subscribers in bulk (up to 500 at once) using an API endpoint.
Note: The bulk API is limited to 500 subscribers per request.
await novu.subscribers.bulkCreate([
{
subscriberId: 'test-subscriber-1',
email: '[email protected]',
firstName: 'subscriber-1',
lastName: 'test-1',
},
{
subscriberId: 'test-subscriber-2',
email: '[email protected]',
firstName: 'subscriber-2',
lastName: 'test-2',
},
{
subscriberId: 'test-subscriber-3',
},
]);
We have added the ability to use tags in the workflow settings screen.
This change allows use cases where you need to group multiple workflows under the same tag, and then use it to filter subscriber preferences for example.
To override your assigned layout during a trigger event use the layoutIdentifier
property, the layout specified will be used for all emails in the context of that trigger event.
import { Novu } from '@novu/node';
const novu = new Novu('<NOVU_API_KEY>');
novu.trigger('workflow-identifier', {
to: {
subscriberId: '...',
},
payload: {
attachments: [
{
file: fs.readFileSync(__dirname + '/data/test.jpeg'),
name: 'test.jpeg',
mime: 'image/jpg',
},
],
},
overrides: {
layoutIdentifier: 'your-layout-identifier',
},
});
Now you can see the primary provider of a channel in the nodes that show on the workflow editor. This gives you more context and better identification without extra clicks!
Nodes and workflows will now display mis-configured workflows on the dashboard like so:
hasMore
boolean field incase there are more than 100 results available.overrides
part of the triggerFull Changelog: https://github.com/novuhq/novu/compare/v0.18.0...v0.19.0
TL;DR: All you need to know about the latest Novu 0.18.0 release. General Layout design, multi-provider configuration and more!
We're excited to unveil the freshest developments in our latest release. Let's plunge right in and uncover what awaits you!
We have refreshed the layout design to accommodate and provide a foundation for a lot of upcoming future updates regarding the navigation stack and general usability of the system.
In the last update, I mentioned that Novu now supports multiple providers.
Now you can specify who should be the primary provider when you have multiple providers for a particular channel for a given environment. As mentioned in the last release, you can programmatically call a provider identifier during a trigger event.
await novu.trigger("<workflow_trigger_id>", {
to: {...},
payload: {...},
overrides: {
email: { integrationIdentifier: 'the identifier"} ,
sms: { integrationIdentifier: 'the identifier"}
}
});
A migration needs to be run prior to the new version update:
cd apps/api
npm run migration:primary-provider
# .env file in apps/api/src/.env should have a MONGO_URL pointing to your deployment
Now, you can use the Plunk Email provider on Novu.
gitHead
field from all packages by @marvinjude in https://github.com/novuhq/novu/pull/3868
Full Changelog: https://github.com/novuhq/novu/compare/v0.17.2...v0.18.0
TL;DR: All you need to know about the latest Novu 0.17.1 release. Multi-provider Integration support, Multi-tenancy support, cookbook, notification center updates and more!
We're excited to unveil the freshest developments in our latest release. Let's plunge right in and uncover what awaits you!
Now you can connect multiple providers per channel and make them active. This feature is currently in beta.
We also redesigned the Integrations store page to make it more intuitive in selecting & enabling channel providers.
With this feature, you can now do the following:
Specify the provider you want when triggering notifications. Add the integrationIdentifier
to the overrides
object for the specific channel.
await novu.trigger("<workflow_trigger_id>", {
to: {...},
payload: {...},
overrides: {
email: { integrationIdentifier: 'the identifier"} ,
sms: { integrationIdentifier: 'the identifier"}
}
If you're self-hosting Novu, you'll need to pass the env flag, IS_MULTI_PROVIDER_CONFIGURATION_ENABLED
to all services.
Note: In the nearest future, you will be allowed to select a provider based on a tenant and other execution conditions.
We've been hard at work building the base flow, API and processes to support multi-tenancy. This feature is currently in beta testing. It will become generally available in the next release.
We have added support to delete a provider credentials via an API endpoint
The Notification Center widget allows users to see all notification messages. Before now, you can only delete messages one after the other.
There are a few notable updates:
removeAllNotifications
method to the headless service.We have added a unique
and groupBy
handlebar helpers.
{{#each (unique names "name")}}
--<b>{{this}}</b>---
{{/each}}
{{#each (groupBy names "name")}}
<h1>{{key}}<h1>
{{#each items}}
{{age}}-
{{/each}}
{{/each}}
By default, the notification feed page will return 100 notifications and return a hasMore
field if more than 100 notifications exist.
The Activity Feed & Subscriber API will no longer return totalCount
. Due to performance optimizations, they will return a hasMore
boolean flag in cases where there are more results to fetch.
We have added a new function, listenNotificationRecieve
, to listen to when a new notification comes in!
It can be used to retrieve a new notification in real-time and trigger UI changes.
headlessService.listenNotificationReceive({
listener: (message: IMessage) => {
console.log(JSON.stringify(message));
},
});
Now, you can use the Sendchamp SMS provider on Novu.
Workers will now wait for health check to pass before accepting jobs to process, and will perform a graceful shutdown on a terminate signal received by the service manager.
We currently offer [quickstart guides](https://docs.novu.co/overview/quickstart/general-quickstart) for a wide range of major languages and technologies. Feel free to explore these guides to swiftly begin your projects in your preferred programming language.
We have added a [Cookbook section](https://docs.novu.co/cookbook/introduction) to our docs to provide recipes on common tasks.
hasMore
field if more than 100 notifications exist @davidsoderberg in https://github.com/novuhq/novu/pull/3631
hasMore
boolean flag in case there are more results to fetch.Full Changelog: https://github.com/novuhq/novu/compare/v0.16.4...v0.17.1
You can find the full changelog on [GitHub](https://github.com/novuhq/novu/compare/v0.16.4...v0.17.1).
Full Changelog: https://github.com/novuhq/novu/compare/v0.16.3...v0.16.4
Full Changelog: https://github.com/novuhq/novu/compare/v0.16.1...v0.16.3