Releases: novuhq/novu
v0.5.0 - ⭐ New workflow engine and UI Editor
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:
Redesigned backend trigger engine
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.
Redesigned Notification Template Editor
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!
Attachment support on email providers
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'
}]
}
})
Notification center theme customization
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;
};
}
More changes and improvements
- fixed grammatical error in notification form by @tusharsrivastav in #613
- Made changes in the CONTIBUTING.md file for ports information by @AakashRaj20 in #637
- update readme by @souravjain540 in #638
- fix: added support for attachments passing within Novu API by @devblin in #608
- Proper Error Message when used without NovuProvider by @BiswaViraj in #639
- Added env flag for github oauth option by @BiswaViraj in #644
- Upgrade Widget cypress to v10 by @kymppi in #658
- Docker-compose for local development by @kymppi in #659
- style changed integration to integrations by @AlexVCS in #669
- changed api to API by @Tosin-webdev in #670
- Fixed typo on line 36 by @AlexVCS in #673
- fix: updated the docker env to string by @BiswaViraj in #688
- fix: updated scripts to use cross-env by @BiswaViraj in #685
- fix: team invite not working when already logged in by @samsoft00 in #678
- feat: #686 add termii sms provider by @samsoft00 in #690
- import IMessage + Dark mode (colorScheme update) Documentation by @Lorakus in #698
- Added unseenCount in popover notification component by @Lorakus in #699
- Update Types to support nested payload properties by @dcbartlett-fadv in #701
- Upgraded apps/web cypress to v10 by @devblin in #689
- Fix/update provider hygen template by @samsoft00 in #710
New Contributors
- @tusharsrivastav made their first contribution in #613
- @AakashRaj20 made their first contribution in #637
- @souravjain540 made their first contribution in #638
- @kymppi made their first contribution in #658
- @Tosin-webdev made their first contribution in #670
- @samsoft00 made their first contribution in #678
- @Lorakus made their first contribution in #698
- @vannyle made their first contribution in #558
- @dcbartlett-fadv made their first contribution in #701
Full Changelog: v0.4.2...v0.5.0
v0.5.0-alpha.0
v0.5.0-alpha.0
v0.4.2 - Notification center support for Safari browsers
What's Changed
- Fix gradient picker cross browser by @djabarovgeorge in #610
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
v0.4.1 - React 18 support for notification center
React 18 support for @novu/notification-center
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
What's Changed
- New handlebars titlecase helper by @AlexVCS in #585
- v0.4.0 Release by @scopsy in #595
- removed the null return in useeffect by @BiswaViraj in #596
- Improved documentation: Corrected spelling in README.md by @FidalMathew in #603
- fix : package.json to respect the monorepo structure by @williamsgqdev in #601
New Contributors
- @FidalMathew made their first contribution in #603
- @williamsgqdev made their first contribution in #601
Full Changelog: v0.4.0...v0.4.1
v0.4.0 - The open-source notification infrastructure
The first Novu Notification Infrastructure Release
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:
- Novu API
- Notification management web interface
- Multi Environment Support
- Integration Store
- Notification Center API
- React Notification Center
- And more!
Get started with the novu platform using:
npx novu init
Novu API
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.
Notification management web interface
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!
Notification Center API
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.
Multi Environment Support
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? 😜
Integration Store
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!
Moving from the old @novu/node or @notifire/node packages
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.
What's next?
- Improving documentation and usage guides
- Visual Workflow Editor
- Direct Channel
- Push Channel
- Digest Engine
- and many more exciting features :)
Read more about the new API platform from our documentation site.
Get started with the novu platform using:
npx novu init
Merged issues
subject
now accepts aFunction
ontrigger
method by @CharlieBrownCharacter in #155- Fixed some typo by @bigpreshy in #159
- Some typo and grammar fix by @bigpreshy in #160
- Docker compose support by @osbornetunde in #146
- Add storybook for admin panel by @scopsy in #163
- NX Workspaces Support by @nishit-g in #165
- Update package.json(NX workspace code review) by @nishit-g in #168
- Update providers template by @nishit-g in #170
- Update build scripts to use NX by @scopsy in #169
- Add NX cloud support by @scopsy in #172
- Add project build on setup:project command by @djabarovgeorge in #178
- Border style on window widget #176 by @djabarovgeorge in #179
- Configure Renovate by @renovate in #186
- Implement OAuth flow with GitHub by @djabarovgeorge in #187
- Pin dependencies by @renovate in #191
- Pin dependency apollo-boost to 0.4.9 by @renovate in #192
- Update dependency @types/express to v4.17.13 by @renovate in #194
- Add npx only-allow-pnpm to avoid people running yarn install by @djabarovgeorge in #195
- Update dependency @types/react-helmet to v6.1.5 by @renovate in #200
- Update dependency cypress-intellij-reporter to v0.0.7 by @renovate in #201
- Update docker files to use pnpm by @djabarovgeorge in #199
- Update dependency react-scripts to v4.0.3 by @renovate in #203
- Update Node.js to v14.18.3 by @renovate in #208
- Update dependency styled-components to v5.3.3 by @renovate in #205
- Update docusaurus monorepo to v2.0.0-beta.14 by @renovate in #206
- Update dependency @typescript-eslint/eslint-plugin to v4.33.0 by @renovate in #212
- Update dependency @types/react-router-dom to v5.3.3 by @renovate in #211
- Update dependency hygen to v6.1.0 by @renovate in #216
- Update dependency jira-prepare-commit-msg to v1.6.2 by @renovate in #217
- Update github actions to use pnpm by @djabarovgeorge in #197
- Search for other npm usages in the repository to replace with pnpm by @djabarovgeorge in #220
- Add capitalization to subscribers names on activity list page by @ainouzgali in #221
- PNPM dependency management by @djabarovgeorge in #185
- Pin dependencies by @renovate in #189
- Update dependency @aws-sdk/client-ses to v3.48.0 by @renovate in #210
- Update dependency standard-version to v9.3.2 by @renovate in #204
- Update dependency @istanbuljs/nyc-config-typescript to v1.0.2 by @renovate in #193
- Update react-router monorepo by @renovate in #207
- Update dependency @types/jest to v27.4.0 by @renovate in #222
- Update dependency axios to v0.25.0 by @renovate in #213
- Mantine layout integration by @scopsy in #225
- ➕ Add @emotion/react and @emotion/styled by @scopsy in #226
- RLD-86: Add linter action for projects by @scopsy in #231
- RLD-68 Flaky password reset test add debug lines by @scopsy in #232
- Environment variables configuration by @djabarovgeorge in #229
- Updated deprecated environment variable by @djabarovgeorge in #233
- Update docker-compose to use pre-built images from ghcr by @djabarovgeorge in #235
- Typography Buttons Colors - starting mantine by @ainouzgali in #230
- Update docker files location by @djabarovgeorge in #237
- [RLD-88] - Docker compose api error fix by @scopsy in #238
- Create shadow styles and add to Button by @ainouzgali in #239
- RLD-92 Add sdk serving to docker compose by @scopsy in #241
- [RLD-94] Add documentation on how to run docker compose by @scopsy in #242
- Rld 18 switch buttons by @ainouzgali in #244
- Implements Telnyx SMS provider by @Abobos in #227
- RLD-20 Inputs + Form Fields by @ainouzgali in #247
- Create CLI project scaffold by @djabarovgeorge in #248
- [RLD-23] - Checkbox component by @rockingrohit9639 in #249
- Added: doc for Hooks feature by @rhythm-sharma in #253
- Rld 22 select inputs by @ainouzgali in #250
- Application name & providers selection by @djabarovgeorge in #252
- Added new SMS provider (Telnyx)to Readme.md by @iampearceman in #262
- [RLD-105] - Create a local server on ephemeral port by @djabarovgeorge in #257
- Table component by @ainouzgali in #255
- Variable naming conventions for camel and pascal casing by @scopsy in #264
- Fix linting rules for padding by @scopsy in #263
- 🚨 Fix web padding eslint issues by @scopsy in #265
- [RLD-106] - Initialize the GitHub auth flow by @djabarovgeorge in #259
- [RLD-108] - Persist JWT token in the u...
V0.3.3 - The fancy frog release 🐸
What's new?
- Email attachments support
- New direct messaging interface
- New NestJS module for Notifire by @devblin in #106
- New readme file for our npm package by @SachinHatikankar100 in #121
- Code generator for SMS providers by @galezra in #131
- Docs for generating a new provider by @cloudguruab in #132
Email attachments support
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: 'recipient@email.com',
$attachments: [{
file: fileBuffer,
mime: 'text/plain',
name: 'event.ics'
}]
});
NestJS module
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: 'sender@mail.com',
}),
],
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: 'reciever@mail.com',
$user_id: 'id'
});
}
}
Mail attachments contributors
- Add Attachments Interface by @davidsoderberg in #93
- Added attachment support for mailjet provider by @devblin in #116
- Nodemailer attachments support by @galezra in #120
- Postmark attachments support by @galezra in #119
- Sendgrid attachments support by @galezra in #117
- Added attachment support to mailgun by @l0ne in #122
- Mandrill attachment by @diganta413 in #124
- Added SES attachments support by @galezra in #129
- Addd emailjs attachment support by @peoray in #130
New providers
- Added Sendinblue as a provider by @galezra in #111
- Added Nexmo/Vonage SMS by @ranrib in #136
- Added sms77 as an SMS provider @matthiez in #134
Other changes
- Fixed typo at the quick-start docs page by @chasmfiend in #110
New Contributors in this version
- @chasmfiend made their first contribution in #110
- @devblin made their first contribution in #106
- @galezra made their first contribution in #111
- @l0ne made their first contribution in #122
- @cloudguruab made their first contribution in #132
- @matthiez made their first contribution in #134
- @peoray made their first contribution in #130
- @ranrib made their first contribution in #136
v0.2.5 - The tiny cake release 🍰
What's Changed
- New Amazon SES email provider by @ulentini in #72
- New Mandrill Provider Added by @diganta413 in #63
- Custom template function by @davidsoderberg in #85
- Add SNS sms provider by @Wyfy0107 in #87
- Validator for trigger variables on the message level by @davidsoderberg in #91
Other changes
- Typo fixed by @tonytangdev in #81
Custom template function
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`
}
},
],
});
Validate trigger variables
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`
},
],
});
New Contributors
- @ulentini made their first contribution in #72
- @tonytangdev made their first contribution in #81
- @davidsoderberg made their first contribution in #85
- @diganta413 made their first contribution in #63
- @Wyfy0107 made their first contribution in #87
Full Changelog: v0.2.4...v0.2.5
v0.2.4
What's Changed
Easily create provider
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 #61
New MailJet provider
You can now send emails using mailjet by @deepak-sreekumar in #66
Unified SMS Providers response
A new unified provider response was added to all the SMS providers by @ComBarnea in #62
Fixes
- refactor(@notifire/core): adds a strict mode typescript compilation by @scopsy in #69
- [doc] Updated readme's example by @akhil-gautam in #71
- fix() Fixed
Cannot find module 'handlebars'
error
New Contributors
- @deepak-sreekumar made their first contribution in #66
- @akhil-gautam made their first contribution in #71
Full Changelog: v0.2.3...v0.2.4
v0.2.3
New providers 🚀
Exciting release with 4 new provider:
- Email.js - Special thanks to @artfuldev
- nodemailer - Special thanks to @painotpi
- plivo
- postmark
Improvements ⭐️
- Added codespaces quick setup. Just press
.
on every PR to start developing quickly. - Unified Provider response API. You will get the provider message identifier and the time stamp.
- A brand new theming API! Control the theme of your messages easily.
Other bug fixes and enhancements
Thanks to @SachinHatikankar100 and @L8Y for their contributions.