v0.14.0 - Performance optimization and redesigned workflow editor
What’s new in Novu 0.14.0?
TL;DR: All you need to know about the latest Novu 0.14.0 release. Performance optimization, Workflow UI Editor, Data expiration, Headless Notification Center and more!
0.14.0 Release Updates
We're stoked to share new updates on our latest release. Let's dig in!
Performance Optimization
We have worked extremely hard to improve the core performance of Novu. I'll highlight crucial things to note and be aware of:
- Improved Caching.
- Optimized Indexes. Indexes are defined on each schema file at the bottom.
New Worker Service
Breaking Change: A new service is required to run with Novu called @novu/worker
, extracted from the @novu/api
monolith to ensure that queues and jobs are processed faster. Novu Cloud users do not need to be concerned about this change.
Novu self-hosted users can now scale the worker service independently as much as the hardware their hosted domain runs on.
For Novu self-hosted users running on Docker, it is now necessary to pull in the new worker service image in order for Novu to work properly. This is already taken care of here & here. When you run docker-compose up, the worker image will be automatically pulled in. No extra steps are needed.
Data Expiration
The Jobs and Messages collection now has a TTL and will be removed from the database when it expires. For Novu cloud users, notifications and activity feed data will be saved for 1 month, while in-app messages will be saved for 6 months. After that time, the records will be archived.
For Novu self-hosted users, the same time frame applies before records will be deleted. However, they can disable the TTL setting by adding the environment variable DISABLE_TTL=true
.
Affected schemes:
- Notification (for 1 month)
- Job (for 1 month)
- Message (for in-app messages - 6 months, for all other messages - 1 month)
- Execution Details (for 1 month)
New Workflow UI Editor
We're constantly iterating on the UI editor to reduce the number of clicks needed to perform specific actions, improve the UX, and provide a great experience in setting up notification workflows.
In this release, we simplified the workflow editor UI like so:
Headless Notification Center
You might have heard the phrase: “Bring Your Own...” or something along those lines.
We encourage you to bring your UI with the newly released framework-agnostic headless version of Novu's notification center.
This lightweight library allows you to incorporate our notification system into any framework or vanilla JavaScript app without UI constraints. Install and call the API methods needed to access the notification system.
Install:
npm install @novu/headless
Use:
import { HeadlessService } from '@novu/headless';
You can now fetch all In-App notifications shown like so:
const headlessService = new HeadlessService({
applicationIdentifier: 'APP_ID_FROM_ADMIN_PANEL',
subscriberId: 'USER_ID',
backendUrl: 'YOUR_BACKEND_URL',
socketUrl: 'YOUR_SOCKET_URL',
});
headlessService.initializeSession({
listener: (session) => {
console.log(session);
},
onSuccess: (session) => {
console.log(session);
},
onError: (error) => {
console.error(error);
},
});
headlessService.fetchNotifications({
listener: ({ data, error, isError, isFetching, isLoading, status }) => {
console.log({ data, error, isError, isFetching, isLoading, status });
},
onSuccess: (response: IPaginatedResponse<IMessage>) => {
console.log({response.data, response.page, response.totalCount, response.pageSize});
},
page: 1, // page number to be fetched
});
Maqsam SMS Provider Integration
Now, you can use the Maqsam SMS provider on Novu.
Termii SMS Provider Integration
Now, you can use the Termii SMS provider on Novu.
SMSCentral SMS Provider Integration
Now, you can use the SMSCentral SMS provider on Novu.
Sparkpost SMS Provider Integration
Now, you can use the Sparkpost SMS provider on Novu.
All Changes
- feat: add faq page for notification center by @jainpawan21 in #2848
- fix: layout docs by @jainpawan21 in #2947
- change method from remove to delete by @AvinashUtekar in #3054
- feat: reduce min pool size by @ainouzgali in #3068
- fix: remove activity and add notification tag by @jainpawan21 in #3065
- fix: update nc demo commands by @jainpawan21 in #3080
- fix: save userhash for intercom in getmyprofile usecase by @jainpawan21 in #3081
- fix: add missing authmodule import in layout module by @jainpawan21 in #3077
- feat: add webpushconfig and update sidebar positions by @jainpawan21 in #3067
- fix: Node client bulk trigger by @szbartnik in #3066
- chore(docs): disabling Google Analytics by @andrewgolovanov in #3087
- docs: change introduction messaging by @sumitsaurabh927 in #3082
- fix(deps): update dependency mongoose to v6.10.4 by @renovate in #3089
- fix(deps): update nest monorepo to v9.3.12 by @renovate in #3091
- fix(deps): update dependency styled-components to v5.3.9 by @renovate in #3090
- chore(deps): update dependency @commitlint/cli to v17.5.0 by @renovate in #3092
- chore(deps): replace dependency rollup-plugin-node-resolve with @rollup/plugin-node-resolve ^6.0.0 by @renovate in #3037
- chore(deps): update dependency @nestjs/cli to v9.3.0 by @renovate in #3093
- feat(api): create webhook filter backoff strategy use case by @p-fernandez in #3086
- chore(deps): update dependency jasmine-core to ~4.6.0 by @renovate in #3094
- chore(deps): update dependency rxjs to v7.8.0 by @renovate in #3095
- Job grouping by @davidsoderberg in #3011
- fix: delay metadata should show if active index is zero by @ainouzgali in #3104
- fix: upgrade bullmq versions by @scopsy in #3105
- chore: add nb and sv translations for notification actions by @katyaterletskaya in #3110
- feat(api): delete topic endpoint by @p-fernandez in #3099
- feat: refactor cache functions by @djabarovgeorge in #3079
- feat: cache notification template by trigger identifier by @djabarovgeorge in #3074
- feat: Maqsam SMS provider added by @adriantoro26 in #3055
- chore(cspell): add provider name to cspell by @p-fernandez in #3115
- NV-1915 - 🐛 Bug Report: infobip sms provider error by @gitstart in #3117
- [New SMS Provider]: Add Sms Central provider by @guiruiz in #3101
- fix(integration): tlsOptions for nodemailer integration by @akhill10 in #3048
- NV-1010 - Create webhook parser for SES (email) by @gitstart in #3085
- refactor(docs) Update CLI prompt message by @guiruiz in #3121
- Sumit by @sumitsaurabh927 in #3097
- Format code with prettier by @deepsource-autofix in #3124
- feat(wip): added cached entity by @djabarovgeorge in #2489
- fix: added check for tls options before json stringify to avoid empty string by @akhill10 in #3127
- feat(api): in-memory provider service by @p-fernandez in #3120
- feat: add mark message action as seen dto by @jainpawan21 in #3084
- feat: add secondary preferred by @ainouzgali in #3134
- feat(worker-service): move the jobs processing logic to the new service by @LetItRock in #3076
- chore(application-generic): move shared services to application-generic package by @LetItRock in #3088
- chore(api,worker-service): fixed failing workflow e2e tests by @LetItRock in #3111
- chore(api,worker-service): move shared use-cases to the application-generic package by @LetItRock in #3130
- feat: hash reset tokens by @michaldziuba03 in #3112
- feat(api): distributed lock service should reuse in memory provider svc by @p-fernandez in #3123
- Added a section about the Seen/Read filter by @iampearceman in #3141
- Read pref optimizations by @scopsy in #3143
- feat: add Redis clusters for local development by @Cliftonz in #3144
- fix(docker): revert docker readme change by @Cliftonz in #3146
- Update step-filter.md by @unicodeveloper in #3148
- fix: Add missing import for AuthModule by @BiswaViraj in #3149
- fix: get latest version of actor details while retreiving messages/feed list by @BiswaViraj in #3075
- feat: add new relic worker instrumentation by @scopsy in #3150
- Add Novu Ruby to the list of SDKs in README.md by @unicodeveloper in #3151
- Docs: Add Novu Kotlin to the list of SDKs in Readme.md by @unicodeveloper in #3153
- NV-1898 - Missing scrollTo channel in quickstart -> configure provider by @gitstart in #3147
- fix(infra): docker compose development fix by @p-fernandez in #3160
- Bug: Novu EE workflow Fix by @Cliftonz in #3132
- fix: show termii sms provider in integration store by @jainpawan21 in #3156
- fix(deps): update dependency react-hook-form to v7.43.9 by @renovate in #2739
- feat(integration): add sparkpost provider to integration page by @peoray in #3072
- Index Cleanup - Execution Details by @djabarovgeorge in #3109
- chore(deps): update dependency @commitlint/cli to v17.5.1 by @renovate in #3168
- feat: remove yearly stats due to performance issues by @scopsy in #3171
- Initial setting of TTL index by @ainouzgali in #3108
- feat: introduce ttl index by @ainouzgali in #3172
- Index Cleanup - Job by @djabarovgeorge in #3133
- chore(worker-service): fixed worker-service tests and created test pipeline by @LetItRock in #3161
- feat: add query redis key prefix by @djabarovgeorge in #3176
- Update docker-compose.yml by @MD-Fleksa in #3173
- nv-2054-implement-redis-cluster-service by @p-fernandez in #3177
- fix: add reply to support for aws ses provider by @deep-bhatt-pmc in #3131
- feat(test): Add cypress component test to OrganizationSelect component by @peoray in #3182
- NV-2060 - 🐛 Bug Report: Incomplete i18n by @gitstart in #3181
- chore(deps): update dependency @types/react to v17.0.56 by @renovate in #3170
- feat: add iframe styles example by @jainpawan21 in #3165
- Novu headless library by @BiswaViraj in #3175
- fix(deps): update dependency mongoose to v6.10.5 by @renovate in #3185
- Nv 2109 add example for socket listener by @BiswaViraj in #3190
- fix: add inbound parse api tag and nc font awesome faq by @jainpawan21 in #3191
- Index Cleanup - Messages by @djabarovgeorge in #3107
- perf: improve auth flow performance by @scopsy in #3195
- feat: add redis auto pipeline by @scopsy in #3198
- feat(worker): add worker deployment by @Cliftonz in #3197
- feat(cluster): implement wait until readiness functionality by @p-fernandez in #3192
- refactor: remove duplicate cache service initialization by @scopsy in #3199
- fix : responsive notification center for mobile devices by @amitanshusahu in #3196
- chore(deps): update dependency @storybook/testing-library to v0.1.0 by @renovate in #3189
- chore(docs): change the the api docs domain for redirecting by @andrewgolovanov in #3159
- fix: add missing mail server domain env by @djabarovgeorge in #3208
- [WIP] feat(worker-service): jobs processing service by @LetItRock in #3070
- fix: missing email override by @djabarovgeorge in #3207
- chore: update jarvis cli and docs by @LetItRock in #3183
- fix: missing email override by @djabarovgeorge in #3213
- add ttl index configuration by @ainouzgali in #3194
- feat(docs): add mailgun provider documentation by @peoray in #3204
- fix(app-generic): allow jest to use axios using cjs by @p-fernandez in #3218
- feat(cluster): add prefix to distributed lock for autopipelining by @p-fernandez in #3217
- feat(worker): move the trigger queue to worker app by @LetItRock in #3222
- Format code with prettier by @deepsource-autofix in #3224
- Ttl configuration merge by @ainouzgali in #3210
- chore: update docusaurus version to 2.3.1 by @jainpawan21 in #2912
- fix(application-generic): inject env variables for tests by @p-fernandez in #3223
- fix: swagger details for apis by @jainpawan21 in #3164
- fix: remove example folder by @jainpawan21 in #3232
- fix: address extraction by @djabarovgeorge in #3235
- feat(infra): allow to enable autopipelining in cache service via ff by @p-fernandez in #3233
- fix(api): improve the flow of mark message as use case for performance by @p-fernandez in #3238
- fix: add new providers in readme by @jainpawan21 in #3229
- feat(docker): updated the docker compose files and k8s to use worker app by @LetItRock in #3231
- Activity Feed: show subscriberId instead of novu's internal id by @ainouzgali in #3239
- feat(docs): Add infobip provider documentation by @peoray in #3221
- feat(docs): Add mandrill provider documentation by @peoray in #3219
- feat(docs): Add netcore provider documentation by @peoray in #3220
- Added redis service in kustomize by @palashbasik in #3188
- feat: switch to using production node env instead of env by @scopsy in #3236
- format code with prettier by @deepsource-autofix in #3241
- chore(deps): update dependency @types/react to v17.0.58 by @renovate in #3201
- feat(infra): enable autopipelining to elasticache by @p-fernandez in #3245
- feat: speed up eslint parser timing by @scopsy in #3250
- feat: add combined testing pipeline by @scopsy in #3253
- feat(app-generic): add cluster pipeline logging in cache service by @p-fernandez in #3256
- Add Nextjs NEXT_PUBLIC_NOVU_CLIENT_APP_ID to vercel integration by @Cliftonz in #3247
- chore(deps): update dependency html-webpack-plugin to v5.5.1 by @renovate in #3242
- Inject CONTEXT_PATH variables defined in .env to images for reverse proxy routing by @RtiM0 in #3226
- chore(deps): update dependency @tsconfig/docusaurus to v1.0.7 by @renovate in #3260
- feat: refactor layout of workflow by @davidsoderberg in #3100
- fix(deps): update dependency @nestjs/graphql to v10.2.1 by @renovate in #3261
- fix(deps): update dependency ioredis to v5.3.2 by @renovate in #3262
- chore(deps): update commitlint monorepo to v17.6.1 by @renovate in #3264
- Fixing multiple push providers issue NV-2156 by @TNAJanssen in #3259
- chore(deps): update dependency @nestjs/cli to v9.4.0 by @renovate in #3267
- Add reply to address to compilation by @scopsy in #3263
- docs: add faq for ttl by @ainouzgali in #3275
- fix: dont store deleted template that are missing in next env(prod) by @djabarovgeorge in #3209
- Index Cleanup - Notification by @djabarovgeorge in #3174
- Index Cleanup - Subscriber by @djabarovgeorge in #3178
New Contributors
- @AvinashUtekar made their first contribution in #3054
- @szbartnik made their first contribution in #3066
- @adriantoro26 made their first contribution in #3055
- @guiruiz made their first contribution in #3101
- @akhill10 made their first contribution in #3048
- @michaldziuba03 made their first contribution in #3112
- @MD-Fleksa made their first contribution in #3173
- @deep-bhatt-pmc made their first contribution in #3131
- @amitanshusahu made their first contribution in #3196
- @palashbasik made their first contribution in #3188
- @RtiM0 made their first contribution in #3226
- @TNAJanssen made their first contribution in #3259
Full Changelog: v0.13.0...v0.14.0