Open-Source Notification Platform. Embeddable Notification Center, E-mail, Push and Slack Integrations.
OTHER License
Published by scopsy about 2 years ago
Exciting news to share with you all! This cycle was a bit shorter because the team was on our very first company offsite, and it was the first time we met in person ๐
Nonetheless, we prepared some of the long-awaited features based on your request. So let's dive in!
Starting with the v0.8.0
release, you will be able to add a new Delay step type that will delay the sending of the next step by the time you specify it too. This is useful if you wish to wait a day or an hour before sending something to the user.
In the next feature, we will also allow passing a dynamic delay timestamp on the API request so you can create reminders and snooze for users based on a dynamic field. Exciting times ๐คฏ And thanks to our fantastic @ainouzgali, that took ownership of this one.
You can now filter step execution based on the request criteria from subscriber
and payload
. This can help customize flows for translation and only send specific steps based on subscriber properties such as paying customers, etc...
Kudus to @davidsoderberg ๐ธ๐ช for making this a reality!
From this version, all secret credentials on the integration store will be encrypted on the database and decrypted in real time when needed to send an actual request. @djabarovgeorge made sure this feature is backward compatible, but you must add a new secret environment key when upgrading to v0.8.0
.
You must pass a STORE_ENCRYPTION_KEY
environment variable to your docker-compose .env
file. This key should be 32 characters long and stored in a secret store.
Thanks to @venarius you can now switch between multiple organizations you are part of. Look at the new organization switcher at the left bottom part of the navigation menu ๐
One of the most exciting features of this release was done by the one and only @venarius. On the template level, you can make some variables required or provide polyfill values for each.
No more Hello null
!
Full Changelog: https://github.com/novuhq/novu/compare/v0.7.3...v0.8.0
Published by scopsy about 2 years ago
Full Changelog: https://github.com/novuhq/novu/compare/v0.7.2...v0.7.3
Published by scopsy about 2 years ago
A small patch release with work created by the community and our core team.
Full Changelog: https://github.com/novuhq/novu/compare/v0.7.1...v0.7.2
Published by scopsy about 2 years ago
This is our biggest release yet, with over 30 contributors and 130 Pull requests with awaited features such as Push, Chat, Subscriber Preference API, API Reference documentation, and more... Let's dive in!
From this release, your application notification subscriber will be able to configure their preferences from within the notification center or directly via our API.
By default, all existing templates prior to 0.7.0 will be marked as critical
and will be excluded from the preference list. To add them, go to the template editor page and un-mark the critical template from the preference defaults.
New templates created after this release will be added to the preference list, and the user can select from the available channels what to not receive and over which channel.
To read more about Subscriber Preference visit the documentation.
Excited to share that from now it's possible to send push notifications to mobile devices using FCM. This feature was entirely built by our amazing community members and specifically by @raikasdev ๐.
APNS and other providers' support will be landed in the next release. Looking for other push providers? Create a GitHub issue or contribute directly.
To send over the push channel, deviceTokens
should be added to the specified subscribers. To read more about it visit the documentation on subscriber credentials and our FCM guide.
One of our requested features was to send notifications with chat applications such as Slack and Discord. And now you can! Chat apps could be directly configured from the template editor and delivered using the webhook_url
mechanism of the chat providers.
To read more about it, visit our guide.
With so many requests by the community members, we just had to do something about it ;) With help from @andrewgolovanov and the entire pixel point team, we are honored to present the first version of our API reference.
Full Changelog: https://github.com/novuhq/novu/compare/v0.6.2...v0.7.0
Published by scopsy about 2 years ago
It is now possible to translate the notification center UI elements by passing a translation object or a premade translation. More info can be found on the documentation page.
Custom object implementation:
<NovuProvider i18n={{
// Make sure that the following is a proper 2 letter language code,
// since this is used by moment.js in order to calculate the relative time for each notification
lang: "de",
translations: {
poweredBy: "unterstรผtzt von",
markAllAsRead: "Alles als gelesen markieren",
notifications: "Benachrichtigungen",
},
}}>
</NovuProvider>
Premade languages created by the community:
<NovuProvider i18n={'en'}>
</NovuProvider>
Full Changelog: https://github.com/novuhq/novu/compare/v0.6.0...v0.6.2
Published by scopsy over 2 years ago
Version v0.6.0 introduces so many long-awaited features such as: Digest Engine, multi-tab support on notification center, notifications actions and so many other improvements and bug fixes. This release is the hard work of more 16 individual contributors and collaborators that made this version possible.
The digest engine collects multiple trigger events and aggregates them into a single message delivered to the subscriber in form of an email, ,in-app notification or any other supported novu channel.
This becomes useful when a user needs to be notified on a large number of triggers, and you want to avoid sending too many notifications. Novu will automatically batch the incoming trigger events based on the subscriberId
and an optional digestKey
that can be added to control the digestion of the events.
Here is an overview of the digest flow, including both supported strategies: Regular and Backoff.
To learn more about the digest engine and the additional strategies and usage guide, visit our docs page here.
Now, creating an even richer experience with the novu notification center is possible, and adding action buttons to a dedicated notification template. Subscribers can make interactions such as accepting invites or friend requests from the notification center without navigating to a different URL.
It is now possible to configure multiple feed configurations for various notification center templates. The feeds created can be used to fetch notifications for each feed separately. This can help to achieve a multi-tab experience for subscribers depending on the actual use-cases.
Thanks to @FidalMathew you can now choose to sync your theme preference for you system, or select light & dark modes which will be persistent across browser refreshes.
Created by our amazing community member @samsoft00 you can now interact with Novu using the new go-lang SDK. Info can be found here: https://github.com/novuhq/go-novu
Full Changelog: https://github.com/novuhq/novu/compare/v0.5.1...v0.6.0
Published by scopsy over 2 years ago
This minor release brings some UI and UX improvements to the notification workflow editor and some bug fixes.
Previously when a subscriber was created using the trigger.event method, we wouldn't update it's details with new information brought from the to
object when another triggered was performed. This caused multiple users not to receive an email or SMS due to invalid email saved originally on the subscriber.
Now the subscriber entity will be updated upon delivery.
When importing the @novu/notification-center
using the method suggested in docs an error was received:
Uncaught TypeError: Cannot read properties of undefined (reading 'unseenBadge')
This is now fixed.
Full Changelog: https://github.com/novuhq/novu/compare/v0.5.0...v0.5.1
Published by scopsy over 2 years ago
Extremly excited to anounce our latest release which includes an entire redesign of our trigger engine, a brand new and shining workflow editor on the web management platform, notification center theme customization, and a lot more goodies! Let's check it out:
To support a more complex Novu usecase with custom flows and events we had to reimagine how our trigger engine works, instead of processing just the hardcoded configuration of delivery a user can now specify a tree-like flow with a custom order of nodes. This infra change will help us to support the upcoming: Digest, Delay, Decision trees, and more.
In this change, we also introduced BullMQ to manage or step execution Queue to support better persistency and scalability as it will allow us to scale trigger processing across multiple machines in the next upcoming releases.
One of the biggest steps to support our future plans is the redesigned Workflow Editor when editing a notification template. Previously, you could only decide on a channel but couldn't control more than one message of this particular channel, and couldn't control the order of execution.
Introducing the new workflow editor powered by React-Flow:
This new workflow will be the basis of more exciting features we are about to release in the upcoming weeks!
Thank to our amazing contributor @devblin, it is possible to send attachments with your emails. You can easily add attachments using the following API:
import { Novu } from '@novu/node';
const novu = new Novu(process.env.NOVU_API_KEY);
novu.trigger('event-name', {
to: {
subscriberId: '...'
},
payload: {
attachments: [{
file: fs.readFileSync(__dirname + '/data/test.jpeg'),
name: 'test.jpeg',
mime: 'image/jpg'
}]
}
})
Based on a lot of your requests, it is possible now to customize the notification center component visuals for in our React component. Here is how you can do that:
const theme = {
dark: {
// Dark Theme Props
},
light: {
// Light Theme Props
},
common: {
// Common
}
};
return (
<PopoverNotificationCenter theme={theme}>
</PopoverNotificationCenter>
);
For more information about the different parts of the theme configuration:
export interface INovuTheme {
layout?: IThemeLayout;
header?: IThemeHeader;
popover?: IThemePopover;
notificationItem?: IThemeNotificationListItem;
footer?: IThemeFooter;
loaderColor?: string;
unseenBadge?: IThemeUnseenBadge;
}
export interface IThemeLayout {
background?: string;
boxShadow?: string;
borderRadius?: string;
wrapper?: {
secondaryFontColor?: string;
};
}
export interface IThemeHeader {
badgeColor?: string;
badgeTextColor?: string;
fontColor?: string;
}
export interface IThemePopover {
arrowColor?: string;
}
export interface IThemeNotificationListItem {
seen?: {
fontColor?: string;
background?: string;
timeMarkFontColor?: string;
};
unseen?: {
fontColor?: string;
background?: string;
boxShadow?: string;
notificationItemBeforeBrandColor?: string;
timeMarkFontColor?: string;
};
}
export interface IThemeFooter {
logoTextColor?: string;
logoPrefixFontColor?: string;
}
export interface IThemeUnseenBadge {
color?: {
fillColor?: string | ISvgStopColor;
borderColor?: string;
};
}
Full Changelog: https://github.com/novuhq/novu/compare/v0.4.2...v0.5.0
Published by scopsy over 2 years ago
Published by scopsy over 2 years ago
This addresses the issue discussed in #607 that fixes safari browsers fail to render the notification center due to not supported regex expression.
Thank for singhgulshan, @BiswaViraj, and @djabarovgeorge for collaborating on bringing this fix
Published by scopsy over 2 years ago
thanks to the incredible work by @BiswaViraj we are now supporting react 18 for the @novu/notification-center
component, also gone the webpack spreadArray) is not a function
error encountered in #569
Full Changelog: https://github.com/novuhq/novu/compare/v0.4.0...v0.4.1
Published by scopsy over 2 years ago
We are incredibly excited to release our biggest version since the beginning of Novu. This version includes our first milestone in building the best open-source notification infrastructure. The release is a result of our incredible community collaboration and efforts. Check out all the great shoutouts at the end.
This version includes those large chunks of work:
Get started with the novu platform using:
npx novu init
The Novu API was created to manage complex notification delivery use cases. It will be the platform for our future advanced features such as Digest, Scheduling, Time-zone awareness, etc. The API can be accessed from the @novu/node
npm package for Node.js and other languages using the simple rest HTTP API accessed using an API key.
A brand new React-based web interface to manage your notification templates and monitor the activity of sent notifications. We are planning to add and upgrade the web interface on an ongoing basis, looking forward to hearing your opinions and ideas!
You can now add a real-time notification center to your web application, including real-time updates using socket.io. In addition, we provide a react notification center component and an iframe window for non-react apps. You can read more about it here.
Based on the feedback from previous alpha releases, we have added support for multiple environments inside the web management site. You can make changes to your dev environment and then commit them to the Production Environment. So you can test your changes before pushing them to prod. Which is always a good thing to do, right? ๐
You can now select what email or SMS provider you will send notifications from. Check out the integrations page on the web management platform. New integrations are coming soon!
The last versions below v0.4.0
only supported stateless and in-code notification template management. If you don't plan to use the Novu API and web management platform, you will need to download the @novu/stateless
library, which has an identical API to the old package. Read more about the stateless library here.
Read more about the new API platform from our documentation site.
Get started with the novu platform using:
npx novu init
subject
now accepts a Function
on trigger
method by @CharlieBrownCharacter in https://github.com/novuhq/novu/pull/155
Full Changelog: https://github.com/novuhq/novu/compare/v0.3.5...v0.4.0
Published by scopsy almost 3 years ago
This incredible community effort started from @davidsoderberg who took on him to finalize the interface for the $attachments
and later on all the community took the effort to update all of our 9 email providers.
So how this works?
The $attachment
interface receives an array of attachment objects. Each attachment contains a file buffer, the mime type and the attachment name to be used.
const fileBuffer = fs.readFileSync('event.ics');
await notifire.trigger('test', {
$user_id: '1234',
$email: '[email protected]',
$attachments: [{
file: fileBuffer,
mime: 'text/plain',
name: 'event.ics'
}]
});
Created by @devblin you can now use notifire in your nestjs application easily by installing the @notifire/nest
package.
Initializing module with templates and providers:
import { NotifireModule } from "@notifire/nest";
@Module({
imports: [
NotifireModule.forRoot({
providers: [
new SendgridEmailProvider({
apiKey: process.env.SENDGRID_API_KEY,
from: '[email protected]',
}),
],
templates: [
{
id: 'password-reset',
messages: [
{
subject: 'Your password reset request',
channel: ChannelTypeEnum.EMAIL,
template: `
Hi {{firstName}}!
To reset your password click <a href="{{resetLink}}">here.</a>
`,
},
],
},
],
}),
],
})
Using notifire's singleton service in other services and modules:
import { Injectable } from '@nestjs/common';
import { NotifireService } from '@notifire/nest';
@Injectable()
export class UserService {
constructor(private readonly notifire: NotifireService) {}
async triggerEvent() {
await this.notifire.trigger('password-reset', {
$email: '[email protected]',
$user_id: 'id'
});
}
}
Published by scopsy almost 3 years ago
In some cases, if you want to use your own template engine and not the built handlebars compiler, you can pass a function as the template
in the message object.
await templateStore.addTemplate({
id: 'test-notification-promise',
messages: [
{
subject: '<div>{{firstName}}</div>',
channel: ChannelTypeEnum.EMAIL,
template: (trigger: ITriggerPayload) => {
return `Custom rendered HTML`
}
},
],
});
From this version, you can run a validator for the ITriggerPayload
passed to each message.
class JoiValidator extends IMessageValidator {
constructor(private joiSchema) {}
async validate(payload) {
const { error } = this.joiSchema.validate(payload);
if (error) throw new Error(error);
return true;
}
}
await templateStore.addTemplate({
id: 'test-notification-promise',
messages: [
{
validator: new JoiValidator(Joi.object({
firstName: Joi.string(),
lastName: Joi.string().required(),
})),
subject: '<div>{{firstName}}</div>',
channel: ChannelTypeEnum.EMAIL,
template: `Template`
},
],
});
Full Changelog: https://github.com/notifirehq/notifire/compare/v0.2.4...v0.2.5
Published by scopsy almost 3 years ago
Added a hygen script to generate a new provider boilerplate.
Run yarn run generate:provider
from the root of the project and follow the descriptions by @scopsy in https://github.com/notifirehq/notifire/pull/61
You can now send emails using mailjet by @deepak-sreekumar in https://github.com/notifirehq/notifire/pull/66
A new unified provider response was added to all the SMS providers by @ComBarnea in https://github.com/notifirehq/notifire/pull/62
Cannot find module 'handlebars'
errorFull Changelog: https://github.com/notifirehq/notifire/compare/v0.2.3...v0.2.4
Published by scopsy about 3 years ago
Exciting release with 4 new provider:
.
on every PR to start developing quickly.Thanks to @SachinHatikankar100 and @L8Y for their contributions.