Releases: novuhq/novu
v2.1.0
What’s new in Novu 2.1.0?
TL;DR: Preferences remodelling for 70% improvement in performance of Preference retrieval with an important database migration, 46% reduction in Docker image sizes, and more.
2.1.0 Release Updates
We're excited to share updated focussed on improving database and operational performance in our latest release. Join us as we reveal the improvements our team have been working on!
Preference remodelling and optimization
- All Workflow & Subscriber preferences are now stored in a central Preferences collection to streamline preference retrieval for the
<Inbox />
+ Subscriber Preference API for a more performance subscriber preference management experience, and performance improvements of Worker engine during notification delivery - IMPORTANT: A mandatory database migration is required with this release to prepare for the removal of the
SubscriberPreference
collection and theNotificationTemplateRepository
.{preferenceSettings,critical}
property in a subsequent release. This data is migrated to a centralized Preference collection. Please visit the Data Migration documentation for more information on running the migration script. The following migration of data takes place:- Workflow preference (
NotificationTemplate
.preferenceSettings
)- ->
Preference
record withtype: 'WORKFLOW_RESOURCE'
(for Code-First workflow support) - ->
Preference
record withtype: 'USER_WORKFLOW'
(for Dashboard/API user preference support)
- ->
- Subscriber Global preference (
SubscriberPreference
withlevel: 'GLOBAL'
)- ->
Preference
record withtype: 'SUBSCRIBER_GLOBAL'
- ->
- Subscriber Workflow preference (
SubscriberPreference
withlevel: 'TEMPLATE'
)- ->
Preference
record withtype: 'SUBSCRIBER_WORKFLOW'
- ->
- Workflow preference (
Docker Image optimization for all applications
- 46% reduction in Docker image sizes
- Simplified COPY and RUN commands
- Overall optimization of image structure
- Replace external PM2 dependency for graceful shutdowns with native NestJS shutdown module
What's Changed
- perf(framework): Replace all computed property keys with static declarations by @rifont in #6926
- chore(web): shorten the digest default duration by @djabarovgeorge in #6918
- feat(web,dashboard): opt-out, redirects by @ChmaraX in #6922
- fix(dashboard): Render bold markdown in in app preview by @desiprisg in #6928
- fix(dashboard): Add default values to workflow editor provider form by @desiprisg in #6932
- fix(dal): Reduce default Mongo connections by @SokratisVidros in #6901
- refactor(shared, dal, application-generic, api, web, dashboard): Remove
json-schema-to-ts
dependency and useJsonSchemaDto
everywhere by @rifont in #6921 - fix(dashboard): promote toast env name by @ChmaraX in #6933
- fix(dashboard): create workflow docs link by @ChmaraX in #6936
- fix(dashboard): align heading with the gutter by @ChmaraX in #6935
- fix(web, dashboard): Remove additional quotes in PHP code snippet by @rifont in #6938
- feat(api): invalidate stale workflows by @djabarovgeorge in #6887
- fix(framework): Ensure missing schemas return unknown record type by @rifont in #6912
- feat(dashboard): Add origin prop to CustomStepControls for conditiona… by @BiswaViraj in #6939
- chore(root): Release 2024-11-12 08:05 by @github-actions in #6947
- feat(dashboard): add full utc date for updated at on hover by @djabarovgeorge in #6948
- fix(dashboard): Dropdown border and action picker clickable area by @desiprisg in #6944
- fix(dashboard): Trim tag input tags before adding by @desiprisg in #6942
- fix(dashboard): Allow newlines on trigger workflow payload editor by @desiprisg in #6941
- fix(dashboard): Align header heights by @desiprisg in #6940
- feat(api): Billing alerts on usage emails by @scopsy in #6883
- fix(dashboard): Fix tag input suggestion sorting by @desiprisg in #6943
- feat(dashboard): unify success toasts by @ChmaraX in #6937
- fix(dashboard): opt-in image source by @ChmaraX in #6949
- feat(web,dashboard): opt-in/out tracking by @ChmaraX in #6930
- feat(api): restrict tags to max 8 by @djabarovgeorge in #6929
- chore(root): move selective actions to blacksmith by @blacksmith-sh in #6950
- fix(dashboard): Nv 4679 visiting UI based workflow shows framework code by @BiswaViraj in #6951
- feat(api): Fix previous steps by @tatarco in #6905
- fix(dashboard): Show consistent tag inputs by @desiprisg in #6960
- fix(dashboard): Fix configure action not opening by @desiprisg in #6965
- feat(dashboard): unify clerk primary button with dashboard design by @ChmaraX in #6959
- feat(dashboard): trigger test workflow loading state by @ChmaraX in #6961
- feat(dashboard): autofocus on first create workflow input by @ChmaraX in #6962
- feat(dashboard): align layout based on design by @ChmaraX in #6964
- feat(dashboard): workflow list empty states by @ChmaraX in #6955
- chore(framework, shared, nextjs): Release new versions by @rifont in #6963
- fix(dashboard): Don't suggest added tags in tag input by @desiprisg in #6968
- feat(dashboard): workflow editor error handling by @LetItRock in #6953
- feat(api): add origin backward compatibility mapping by @djabarovgeorge in #6973
- feat(dashboard): in-app editor unsaved changes modal plus handling esc and clicking on drawer gray overlay by @LetItRock in #6958
- refactor(api): Use
UpdatePreference
use-case for all Subscriber Preference updates by @rifont in #6889 - chore(dashboard): disable 1password on the workflow create sidebar by @LetItRock in #6975
- fix(api): upsert preference if exist by @djabarovgeorge in #6970
- feat(dashboard): page meta, gtm, and uptime by @LetItRock in #6974
- feat(dashboard): styling for read-only input fields by @ChmaraX in #6967
- fix(dashboard): Tweak Create Workflow copywriting by @desiprisg in #6971
- fix(dashboard): Workflow saving status on toast and multiple toasts by @desiprisg in #6972
- refactor(api): remove $or query for hash on env by @scopsy in #6969
- chore(dashboard): batch of small fixes by @LetItRock in #6977
- fix(api): fix deletion of issues from persistence once no issues are found by @tatarco in #6956
- fix(web): Preserve last active organization across full page reloads by @SokratisVidros in #6978
- feat(node): add deleteByTransactionId method by @jainpawan21 in #6980
- refactor(worker): Remove redundant Bridge error handling by @rifont in #6875
- chore(dashboard): a few more fixes by @LetItRock in #6985
- feat(api): add tags issues by @djabarovgeorge in #6957
- feat(framework): Expose
Workflow
resource type in public API by @rifont in #6983 - chore(dashboard): revert trigger success toast by @LetItRock in #6987
- fix(api, application-generic): Filter with supplied
tags
when fetching subscriber preferences by @rifont in #6991 - chore(framework): Release version 2.5.0 by @rifont in #6988
- chore(root): Release 2024-11-14 08:06 by @github-actions in #6993
- chore(root): Release 2024-11-13 08:05 by @github-actions in #6981
- feat(dashboard): Save workflow on blur by @desiprisg in #6990
- fix(dashboard): Call save before instantly flushing and instantly save tag changes by @desiprisg in #6997
- feat(dashboard): Selected route background color in sidebar by @desiprisg in #6996
- fix(dashboard): Fix close icon padding in tag input by @desiprisg in #6995
- fix(dashboard): Hide search workflow input by @desiprisg in #6998
- fix(dashboard): Lighten the focus border on inputs by @desiprisg in https://github.com/novuhq/novu...
v2.0.1
What's Changed
- feat(react-native): Add a react native npm package for hooks by @scopsy in #6556
- fix(node): add the missing integration override to sms by @ainouzgali in #6546
- feat(api): apply member limit per billing plan by @ChmaraX in #6630
- fix(api): response interceptor by @BiswaViraj in #6639
- fix(js): incorrect date by @BiswaViraj in #6641
- feat(api): Add api exception mapping by @tatarco in #6601
- fix(framework): Default to health action by @SokratisVidros in #6634
- feat(dashboard): Api methods for v2 by @desiprisg in #6642
- feat(dashboard): Workflow list by @desiprisg in #6615
- fix(api): Log bridge url validation errors by @SokratisVidros in #6643
- feat(framework): Add
disableOutputSanitization
flag for channel step definitions by @rifont in #6521 - feat(api): add status by @tatarco in #6616
- feat(web): update billing plans by @ChmaraX in #6652
- fix(web): Show how often usage metrics update by @SokratisVidros in #6655
- feat(dashboard): env change logic and routes by @LetItRock in #6632
- chore(api): Remove Sentry profiling from all apps by @SokratisVidros in #6660
- feat(application-generic): Add the ability to have query parameters in bridge checks by @elmdecoste in #6633
- feat(dashboard): Workflow list polish by @desiprisg in #6645
- feat(framework): Add NestJS
serve
handler by @rifont in #6654 - feat(dashboard): Empty workflow list state & improvements by @desiprisg in #6666
- fix(worker): Reduce distraction errors by @SokratisVidros in #6662
- chore(application-generic): Stop logging Segment and Mixpanel invocations by @SokratisVidros in #6664
- chore(framework): Release version 2.2.0 by @rifont in #6667
- feat(dashboard): Workflow list dropdown actions by @desiprisg in #6669
- fix(api): fixed deletion + origin bug by @tatarco in #6663
- feat(web): Add autocomplete example to Playground by @rifont in #6668
- chore(dashboard): side nav updates by @LetItRock in #6658
- ci(root): remove redundant API unit test by @ChmaraX in #6678
- fix(api): Use the MongoId for stepId when fetching step controls by @rifont in #6679
- feat(dashboard): header navigation by @LetItRock in #6672
- feat(api): refactor get step schema by @djabarovgeorge in #6651
- fix(api): created at identify using ISO date instead of epoch by @scopsy in #6683
- fix(api): analytics module by @scopsy in #6684
- fix(api): Log exception traits by @rifont in #6685
- refactor(api, worker, application-generic, dal, shared): Rename "ControlVariables" to "ControlValues" by @rifont in #6680
- refactor(api,worker): untagle modules and deps by @ChmaraX in #6673
- feat(js): Com 208 improve the dx of the novu on function to return the cleanup by @BiswaViraj in #6650
- feat(js): Com 145 introduce novunextjs by @BiswaViraj in #6647
- feat(web): Request company size during sign-up by @SokratisVidros in #6676
- feat(api): add workflow trigger identifier parity by @djabarovgeorge in #6657
- feat(api): Add Novu-managed Bridge endpoint per environment by @rifont in #6451
- feat(dashboard): workflow editor route and basic layout by @LetItRock in #6681
- fix(js): Stabilize JS build process by @SokratisVidros in #6695
- feat(dashboard): workflow editor canvas - base step nodes and edges by @LetItRock in #6694
- fix(worker): Use
url
validator forAPI_ROOT_URL
by @rifont in #6698 - chore(web,api): remove redundant code; add/update e2e tests by @ChmaraX in #6688
- chore(dashboard): bring the hrm alive by @LetItRock in #6703
- fix(js): Bypass cache during novu.notifications.list() by @SokratisVidros in #6690
- feat(api): allow passing workflow identifier as id in new v2 workflow crud by @djabarovgeorge in #6691
- chore(web): Added custom step tooltip by @twentyone24 in #6579
- fix(web): Minor UI fix in billing plans by @SokratisVidros in #6665
- feat(dashboard): Nv 4476 workflow editor header navigation by @BiswaViraj in #6700
- feat(api): add get environment tags endpoint by @ChmaraX in #6713
- fix(framework): Support json values in LiquidJS templates by @rifont in #6714
- fix(api): Throw
BadRequestException
when missing controls by @rifont in #6716 - feat(framework, api, web, application-generic): Add
name
anddescription
to Framework workflow options by @rifont in #6708 - feat(novu): custom tunnel support by @wh1337 in #6711
- feat(api, worker, application-generic): Add exhaustive error handling for bridge requests by @rifont in #6715
- feat(dashboard): Create workflow sheet by @desiprisg in #6699
- feat(dashboard): workflow editor add in-app step by @LetItRock in #6706
- refactor(framework): Remove unused retryable codes constant by @rifont in #6720
- fix(application-generic): Allow unauthorized certs for bridge url by @SokratisVidros in #6717
- build(deps-dev): bump rollup from 3.20.2 to 3.29.5 by @dependabot in #6618
- chore(root): Prettier alignment by @SokratisVidros in #6723
- feat(dashboard): workflow editor autosave by @LetItRock in #6718
- feat(framework, web, application-generic): Propagate Bridge server errors to Bridge client by @rifont in #6726
- fix(api): update previous step identifier to step id instead of inter… by @djabarovgeorge in #6689
- chore(framework, novu): Release new versions by @rifont in #6731
- fix(application-generic): handle lock acquisition conflicts by @rifont in #6733
- fix(js): build types by @BiswaViraj in #6732
- feat(dashboard): Tag input suggestions by @desiprisg in #6728
- chore(dashboard): Remove branding from sidebar by @SokratisVidros in #6736
- fix(application-generic, api, worker): Throw client timeout exception for Bridge timeout errors by @rifont in #6737
- feat(api): Add preview endpoint by @tatarco in #6648
- fix(api): Return correct workflow.origin by @SokratisVidros in #6740
- feat(framework): CJS/ESM for framework by @SokratisVidros in #6707
- build(deps-dev): bump rollup from 3.20.2 to 3.29.5 by @dependabot in #6752
- build(deps-dev): bump http-proxy-middleware from 3.0.2 to 3.0.3 by @dependabot in #6745
- fix(root): rebuild env on container start for web by @L-U-C-K-Y in #6722
- fix(framework): Specify
zod-to-json-schema
as a dependency by @rifont in #6741 - feat(api): add slug parser in the api requests by @djabarovgeorge in #6705
- feat(dashboard): handle v1 legacy workflows redirect by @BiswaViraj in #6734
- fix(node): add @novu/nest deprecated warning and add novu/node self host info by @jainpawan21 in #6758
- fix(api): get subscriber preference parameter swagger value by @jainpawan21 in #6696
- chore(api): Increase rate limit window duration to 5 seconds by @rifont in #6759
- fix(framework): Experiement with importing json-schema-faker by @SokratisVidros in #6762
- feat(dashboard): Nv 4479 workflow editor configure workflow drawer by @BiswaViraj in #6729
- feat(dashboard): Avatar picker component by @desiprisg in #6765
- feat(api): revert to full slug b...
v2.0.0
What’s new in Novu 2.0.0?
TL;DR: All you need to know about the latest Novu 2.0.0 release. @novu/framework
and novu
CLI release for code-first workflows, React-based inbox component @novu/react
and headless Inbox component @novu/js
release.
2.0.0 Release Updates
We're excited to share the new features in our latest release. Join us as we reveal the cool things our team have been working on!
@novu/framework
typescript SDK to build code-first workflows
- Building notification workflows with the Novu Framework
- Manage and test local workflows using local studio
- Using custom step to fetch data from external sources
- SDK Specification
- Quick start guide for next.js, nest.js and express.js
novu
CLI to run local studio, generate boilerplate code and sync the workflows
- Use
npx novu@latest init
command to create new project having@novu/framework
based workflows - Use
npx novu@latest dev
command to start the local studio, generate tunnel URL - Use
npx novu@latest sync
command to sync workflows with novu cloud or self hosted environment - Read more on the npm page how to use novu cli and supported flags with each command
What's Changed
- chore: Update submodule by @rifont in #5264
- Nv 3522 sort the languages in the dropdown by @ainouzgali in #5259
- Create a script to increase the amount of storage space on default runner by @Cliftonz in #5262
- Convert script to github action by @Cliftonz in #5266
- Fix gupshup request by @RahulDutta007 in #5258
- Update groups for new default language by @ainouzgali in #5260
- Experimental by @scopsy in #5253
- fix(ci): Versions compatibility by @AliaksandrRyzhou in #5269
- feat: add preview debounce by @scopsy in #5281
- Pyroscope Integration by @Cliftonz in #5243
- chore: update vite package by @scopsy in #5208
- [Design System] Grouped PRs for Panda Setup by @antonjoel82 in #5267
- feat: add messages new api res by @scopsy in #5285
- V0.24.x by @scopsy in #5287
- Fix main branch for package-enterprise by @ainouzgali in #5272
- v0.24.x by @scopsy in #5288
- feat: error handling echo by @scopsy in #5291
- feat(api): search workflows by name or trigger identifier by @LetItRock in #5268
- feat: add echo error activity feed logs by @djabarovgeorge in #5294
- Adds seen read reliable update endpoint by @djabarovgeorge in #5280
- Editor autocomplete - does not open in a second use by @ainouzgali in #5290
- feat: add echo project waitlist components by @jainpawan21 in #5270
- feat(web): workflows allow searching by name or trigger identifier by @LetItRock in #5276
- fix: set novu providers as primary for new orgs by @ainouzgali in #5299
- feat: add hubspot component in shared web by @jainpawan21 in #5286
- Fix: Unhandled Error: Objects are not valid as a React child by @ainouzgali in #5295
- fix(web): workflow settings - providers warnings were cut off by @LetItRock in #5300
- fix: action popover crash by @BiswaViraj in #5301
- justnems-analytics-updates by @justnems in #5284
- NV-3561 | Component Audit by @antonjoel82 in #5297
- fix: Color tokens & legacy mapping by @antonjoel82 in #5307
- Update Otel Exporters by @Cliftonz in #5277
- Unhandled Error: SyntaxError JSON.parse() by @ainouzgali in #5303
- fix: provide notification group on creation by blueprint by @djabarovgeorge in #5296
- fix: update value of cxo founder by @jainpawan21 in #5315
- fix: Fixed Visual Bug in Workflow Editor with Digests by @lovishduggal in #5279
- feat(api): Allow img tags in the In-App & Email Editor by @efaraz27 in #5312
- Translation with params not included in payload generation by @ainouzgali in #5302
- Nv 3526 promoting a translation group default locale not promoted by @ainouzgali in #5316
- feat(dal): add deleted index and type safety index by @djabarovgeorge in #5309
- Add exponential backoff with jitter for the In-App Notification Center to re-establish WebSocket connections by @djabarovgeorge in #5321
- Nv 3593 bug tooltip issue on activities page graph by @BiswaViraj in #5326
- fix: Surface all auth server errors during login in email input. by @SokratisVidros in #5319
- fix(web): Tweak scrollbar placement in sidebar by @SokratisVidros in #5320
- feat: Tweak semantic color tokens by @antonjoel82 in #5332
- feat(api, web): Add annual subscription support by @davidsoderberg in #5335
- build(design-system): Add scripts for storybook build using nx by @rifont in #5333
- fix: used mantine color scheme hook to handle color scheme by @jainpawan21 in #5342
- fix: handle resend error case by @jainpawan21 in #5351
- feat: add product feature interceptor and hook by @davidsoderberg in #5327
- feat: add free trial banner and widget by @davidsoderberg in #5228
- chore(infra): Remove CI steps for redundant general worker by @rifont in #5354
- fix: cache validation during notification template promotion by @BiswaViraj in #5352
- feat(workers): add instrumentation for errors by @scopsy in #5356
- Small dx touch leveraging env var in node sdk by @SokratisVidros in #5346
- feat: Add type guard to improve error handling by @antonjoel82 in #5338
- Conventional comments setup by @antonjoel82 in #5358
- chore: updated the conventional comments script to include emoji by @LetItRock in #5361
- fix(worker): Skip template rendering for Echo Workflow steps by @rifont in #5364
- fix(worker): Skip template rendering for Echo Workflow steps by @rifont in #5365
- chore(infra): Remove CI steps for redundant general worker by @rifont in #5366
- fix(worker): Move missing SMS content check inside echo conditional by @rifont in #5368
- fix(worker): Move missing SMS content check inside echo conditional by @rifont in #5369
- fix(notification-center,widget): infinite scroll issue by @LetItRock in #5371
- chore(deps): bump sanitize-html from 2.10.0 to 2.12.1 by @dependabot in #5251
- build(deps-dev): bump vite from 4.5.2 to 4.5.3 by @dependabot in #5357
- feat: decluttering sentry errors by @ainouzgali in #5336
- fix: console warning controlled to uncontrolled component by @ainouzgali in #5324
- fix(web): make InApp code editor fit the height of its parent container by @FlacorLopes in #5372
- fix(deps): update dependency sanitize-html to v2.12.1 [security] by @renovate in #5252
- chore(deps): update dependency @types/inquirer to v8.2.10 by @renovate in #4899
- feat(ci): add stale bot for pull requests by @scopsy in #5374
- fix: free trial banner by @davidsoderberg in #5378
- chore: Remove unused dependencies by @SokratisVidros in #5382
- Revert "chore: Remove unused dependencies" by @SokratisVidros in #5383
- chore(web): Add feature flag for Hubspot onboarding flow by @rifont in #5386
- chore(web): Add feature flag for Hubspot onboarding flow by @rifont in #5388
- feat: add reply to field in resend by @jainpawan21 in #5389
- chore(repo): D...
v0.24.0
What’s new in Novu 0.24?
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!
0.24 Release Updates
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!
Translation Management Improvements
We’ve made significant enhancements to the Translation management feature.
- Users can now preview translated templates in their preferred languages in the workflow editor.
- A new drag-and-drop functionality for uploading of the translation files.
- We revamped the UI of the step editors significantly enhancing the user experience for template editing.
- Translation Managements Variants Preview
💡 Note: This feature is only available for Novu Cloud for Business and Enterprise Clients.
Deprecation of Original Notifire Packages
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.
Deprecated Packages
- Notifire WebSocket Package (
notifire/ws
) - Notifire Widget Package (
notifire/widget
) - Notifire SDK Package (
notifire/sdk
) - Notifire Web Package (
notifire/web
) - Notifire API Package (
notifire/api
)
Workflow Page Pagination Improvements
We've implemented enhanced pagination on the Workflows page, allowing for easier navigation between pages, displaying more items, and direct access to specific pages.
Auto Remove Deleted Subscribers from Topic
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: #5187
Subscriber Details Now Available For Digest Filters
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: #5234
Notable changes
- ARM Architecture Support by @AliaksandrRyzhou in #5139
- feat(worker): add topics fanout in batches by cursor by @djabarovgeorge in #5165
What's Changed
- feat: add dropzone package by @BiswaViraj in #5108
- feat: add file upload support for cypress by @BiswaViraj in #5127
- fix(ci): CSpell action version update by @AliaksandrRyzhou in #5145
- fix: change whatsapp with discord for chat step by @jainpawan21 in #5149
- fix: change node version to 20.8.1 by @jainpawan21 in #5140
- fix: isend sms provider unexpected provider error by @jainpawan21 in #5135
- Create the channel preview sidebar and route by @ainouzgali in #5128
- fix: side bar title color based on theme by @jainpawan21 in #5155
- Nv 2997 reusable chat preview component by @ainouzgali in #5157
- NV-3417: Pagination component + vitest setup by @antonjoel82 in #5107
- NV-1971: Connect Pagination for Workflows by @antonjoel82 in #5136
- fix(api): bulk create subscribers after they were deleted by @LetItRock in #5160
- feat(provider): add ring central provider (#77) by @KelvisGama in #5147
- Fix client payload on remove messages by @djabarovgeorge in #5159
- Nv 2995 reusable email preview component by @BiswaViraj in #5143
- Nv 3475 - typeerror cannot create property buttons on string by @djabarovgeorge in #5172
- hotfix: NV-3475 by @LetItRock in #5176
- fix(infra): Remove gitignore for EE symlinked src folders by @rifont in #5183
- Auto Remove Deleted Subscribers from topic by @djabarovgeorge in #5187
- feat(web): reusable sms preview component by @LetItRock in #5173
- Nv 2996 reusable push preview component by @BiswaViraj in #5178
- fix(api,web): built in novu integrations for self hosted by @LetItRock in #5158
- fix(ci): Mount token to a build svc command by @AliaksandrRyzhou in #5181
- Nv 3006 - the new chat editor by @ainouzgali in #5180
- [Onboarding] - Refactor tabs and routing by @antonjoel82 in #5184
- fix: sender name and preheader not promoted by @ainouzgali in #5193
- hotfix: sender name and preheader are not promoted by @LetItRock in #5194
- [Onboarding] - Groundwork for all use cases by @antonjoel82 in #5190
- Nv 3005 the new sms editor by @ainouzgali in #5197
- Nv-3365: Material Design Icons by @antonjoel82 in #5196
- feat: add workflow creation from blueprint by @djabarovgeorge in #5189
- Nv 3004 the new push editor by @BiswaViraj in #5191
- feat(api-migration): create cta action migration by @djabarovgeorge in #5175
- fix(web): specify novu version in client by @michaldziuba03 in #5028
- fix: change workflow response to workflows response dto by @jainpawan21 in #5141
- feat(api): Add idempotent subscriber credential update operation by @rifont in #5211
- fix: api key migration widget initialize failure by @djabarovgeorge in #5216
- fix(ci): Setup qemu to fix a docker exporter by @AliaksandrRyzhou in #5220
- fix(ci): --load for WS service by @AliaksandrRyzhou in #5221
- feat: implement cta and avatar by @BiswaViraj in #5217
- feat: add fallback lng by @ainouzgali in #5222
- Nv 2993 reusable in app preview component by @BiswaViraj in #5204
- chore(web): marketing utm campaign on doc links by @LetItRock in #5203
- Remove Helm Default Encryption Key by @Cliftonz in #5226
- Make multiline comments a warning by @antonjoel82 in #5227
- Nv 3510 - Open onboarding workflow node by @djabarovgeorge in #5207
- Nv 3352 - Onboarding Analytics by @djabarovgeorge in #5212
- [Onboarding] NV-3348: Questionnaire Styling Fix & Tests by @antonjoel82 in #5229
- feat(web): translation management variants preview by @LetItRock in #5202
- Nv 3420 css inconsistencies with designs by @BiswaViraj in #5230
- fix: subscriber details not available for digest filters by @MasonD in #5234
- Translation management beta by @ainouzgali in #5124
- fix(web): pagination search params on activity feed page by @LetItRock in #5231
- chore(web): refactor onboarding create workflow from blueprint logic by @LetItRock in #5233
- [Onboarding] NV-3262 | Cypress tests by @antonjoel82 in #5235
- NV-3497 - Pagination Tweaks by @antonjoel82 in #5242
- fix: show changes details for translations by @ainouzgali in #5237
- feature: onboarding experiment setup by @jainpawan21 in https://github.com/novuhq/novu/...
v0.23.0
What’s new in Novu 0.23?
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!
0.23 Release Updates
We're excited to highlight the newest features introduced in our latest release. Join us as we explore what awaits you!
Translation Management
💡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.
Support for Non-Root User (UID 1000)
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:
- Non-Root User Support: Novu now officially supports deployment under a non-root user with a fixed UID of 1000. This update is crucial for enterprise deployments on systems that enforce strict no-root policies, ensuring compliance with security best practices.
- Seamless Integration: This enhancement facilitates smoother integration of Novu into secure environments, reducing the need for workarounds or exceptions in security policies.
- Enhanced Security: Running Novu under a non-root user reduces potential security risks and aligns with the principle of least privilege, further safeguarding our notification infrastructure.
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.
ARM Image Support
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:
- ARM Architecture Support: Users can now deploy Novu on systems powered by ARM processors, benefiting from the efficiency and performance improvements that ARM architectures offer.
- Optimized Performance: ARM support brings optimized performance for ARM-based deployments, ensuring faster and more efficient notification processing.
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.
Deprecation of Original Notifire Packages
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:
Deprecated Packages
- Notifire WebSocket Package (
notifire/ws
) - Notifire Widget Package (
notifire/widget
) - Notifire SDK Package (
notifire/sdk
) - Notifire Web Package (
notifire/web
) - Notifire API Package (
notifire/api
)
NPM Namespace Deprecation
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.
Field-level Encryption to API Keys
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.
Bulk Delete Notifications in Notification Center
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" ],
});
Rocket Chat Provider Integration
You can now send Chat messages via the Rocket Chat provider integration:
Brevo (SendInBlue) SMS Provider Integration
You can now send SMS messages via the Brevo SMS provider integration:
iSend SMS Provider Integration
You can now send SMS via the iSend sms provider integration:
CustomData Overrides for SMS
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",
},
},
},
});
Email Editor Variables Auto-suggestion Dropdown
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.
Notable changes
- v0.20.0 LTS node upgrade by @scopsy in #4556
- fix(api): ApiKey auth guard performance by @rifont in #4972
- Add field-level encryption to API Keys by @djabarovgeorge in #5046
- Refactor move inbound mail parser to worker by @djabarovgeorge in #4986
- Feat(API): Add Remove Messages By Bulk by @djabarovgeorge in #5117
- feat(notification-center): add use remove notifications hook by @djabarovgeorge in #5126
- feat(headless): add remove notifications method by @djabarovgeorge in #5125
What's Changed
- Update Novu to Node 18 LTS by @raikasdev in #4014
- docs(providers): Clickatell documentation incorrectly shows TwilioSmsProvider by @jacques in #4897
- fix(web): Intercom chat bubble should not show after closing integrat… by @PaperBoardOfficial in #4951
- fix(fcm): do not mutate overrides object by @strangeAeon in #4866
- fix(api): logo extension and type should be validated on branding endpoint by @sco...
v0.22.0
What’s new in Novu 0.22?
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!
0.22 Release Updates
We're excited to highlight the newest features introduced in our latest release. Join us as we explore what awaits you!
Multi-tenancy Variants
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.
Idempotency
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:
- feat: add idempotency interceptor by @mahendraHegde in #4531
- fix(api): Use correct idempotency documentation link by @rifont in #4710
- feat(node): add exponential retry mechanism with idempotency headers by @michaldziuba03 in #4462
API Rate Limiting
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:
- feat(application-generic, shared): Add Rate Limiting feature flag in #4667
- feat(dal, shared, api): Add rate limit DAL attributes by @rifont in #4758
- feat(api, shared): Add use cases to resolve an environment's api rate limit in #4774
- chore(api, shared, app-generic): Convert API rate limit FF to be LaunchDarkly compatible in #4857
- feat(api): Add evaluate api rate limit use case in #4844
- feat(api): Add API rate limiting NestJS guard in #4910
- feat(api): Apply rate limit decorators to api controllers and methods in #4915
- feat(api): Add variable-cost token bucket rate limiting algorithm in #4911
Variable Support in the Step Conditions aka Filters
The condition Value
field now supports the use of variables as its value, enhancing the dynamic nature of this functionality.
PRs:
- feat: add support for variables in filter values #4724
Workflow Settings Override for tenants
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:
- Creating, updating and deleting overrides,
- List all overrides, or for one template.
Create new workflow settings overrides
Update workflow settings overrides
PRs:
- Stacked PR's of - Workflow override in #4773
Note: We are currently working on ensuring our SDKs have support for this functionality.
Event Cancellation from Digest
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:
- Feature: Ability to cancel any arbitrary events from digest in #4888
Resiliency and Performance Improvements
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.
Custom SMS Provider Integration
You can now send SMS messages using custom SMS providers using REST API. Do this by setting up the Generic SMS provider:
MessageBird SMS Provider Integration
You can now send SMS messages via the MessageBird SMS provider integration:
BulkSMS Provider Integration
You can now send SMS messages via the BulkSMS SMS provider integration:
SimpleTexting SMS Provider Integration
You can now send SMS messages via the SimpleTexting SMS provider integration:
Azure SMS Provider Integration
You can now send SMS messages via the Azure SMS provider integration:
Braze Email Provider Integration
You can now send emails via the Braze Email provider integration:
Pusher Beams Provider Integration
You can now send messages via the Pusher Beams provider integration:
Grafana On Call Webhook Chat Provider Integration
You can now send messages via the Grafana On Call webhook chat provider integration:
Notable changes
- fix: change default value to true for critical switch by @jainpawan21 in #4882
- fix(web): nc loading issue for eu env by @BiswaViraj in #4904
- feat(api): scripts to remove user account and to remove organization by @LetItRock in #4190
What's Changed
- fix(@novu/fcm): use message instead of body for data-type notifications by @cherfia in #4652
- Updated the name of Twitter to X in all docs by @Arcturus22 in #4662
- 🐛 Add missing NODE_ENV for web deployment by @sachin-duhan in #4672
- Enhanced Security Information via Updating [[SECURITY.md](http://security...
v0.21.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.
0.21 Release Updates
We're thrilled to announce the newest features in our most recent release. Let's get started and explore what's waiting for you!
Removal of the multi-providers
Feature Flag
In 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.
Action Required for Upgrading
To upgrade to this new version, you will need to follow these steps:
💡 Note: You must change the path for each script individually and run it separately.-
Run Migration Script for Creating
primary
andpriority
Fields: You can access the migration script for creatingprimary
andpriority
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 #4402
Notification Center Angular
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 #4518
Actor System Variables
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.
- You can now leverage
actor
system variables in your channel editors.
- When setting up a "Run a Test" Trigger, the application will prompt the user to provide
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 #4278
Brand Logo Management
This release introduces a new functionality that allows you to update or remove your brand logo seamlessly.
- Update Brand Logo: You can now easily replace your existing brand logo with a new one, giving your application a fresh look.
- Remove Brand Logo: If you prefer a cleaner interface, you have the option to remove the brand logo altogether.
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 #4451
New Provider: Pushpad
We are excited to introduce a new integration with Pushpad in this release.
You can learn more about this provider here.
PR Details:
- feat: add Pushpad provider for web push notifications by @collimarco in #4235
Organization APIs Enhancement
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.
- Manage Organizations: With the Organization APIs, clients gain full control over their organization's settings and configurations.
- List and Remove Members: Easily access and manipulate the list of organization members, allowing for efficient membership management.
- Branding Updates: Organizations can now update their branding effortlessly using these APIs, ensuring consistent and up-to-date branding across the board.
- Member Invitations: For inviting new members, we've introduced a separate endpoint
POST /invites
, simplifying the process of expanding your organization.
PR Details:
- fix: organization apis are accessible through api key by @jainpawan21 in #4619
Notable changes
- chore: dependencies security vulnerability fix by @scopsy in #4532
- Add Trigger Identifier to the Subscriber Preferences response by @djabarovgeorge in #4559
- fix(api): Cancel all jobs related to a transactionId from the 'cancel' method by @scopsy in #4616
What's Changed
- feat: Update Cypress to the latest version by @ayushshukla7777 in #4519
- added Typescript docs by @krishvsoni in #4525
- Update [README.md](http://readme.md/) by @Shivam250702 in #4520
- Update nodemon version by @scopsy in #4227
- Fix: visual bug on plus button in editor by @Akhilbisht798 in #4444
- fix: Bug fixed for add filter button in production by @sjcode99 in #4284
- docs: fix typo in docker/kubernetes/helm/README.md by @suravshrestha in #4510
- docs: fix typo in packages/node/README.md by @suravshrestha in #4509
- PNPM upgrade by @scopsy in #4528
- fix: cypress parallel by @scopsy in #4530
- chore: Updated Mocha to 10.2.0 by @ayushshukla7777 in #4536
- fix(worker): self hosted metrics services were not shutdown properly by @p-fernandez in #4514
- fix/docs: update README component links by @nick-w-nick in #4389
- chore(deps): update dependency inquirer to v8.2.6 by @renovate in #4548
- fix(server): made entire reactangle clickable rather than arro only by @AnshuPathak-88825 in #4535
- chore(deps): update microsoft/pr-metrics action to v1.5.7 by @renovate in #4549
- fix: so get environment is not shown in swagger by @davidsoderberg in #4490
- style: update log message to better reflect context by @scopsy in #4555
- Feat : add readiness health check retry by @djabarovgeorge in #4475
- ♻️ Refactor Create Queue Health Indicator by @djabarovgeorge in #4513
- fix(infra): some pnpm workspace improv for dev flow by @p-fernandez in https://github.com/novuhq/novu/pull/454
- redis docs by @krishvsoni in #4578
- fix: updated the print-affected-array script after updating the nx by @LetItRock in #4576
- Update [README.md](http://readme.md/) by @Emmarie-Ahtunan in #4600
- Added words for Kannada language translation and also changed the language code by @Atharva1723 in #4598
- fix: Added Warning and Error icons to Worlflow settings component by @rayy40 in #4413
- Fix icon overlapping by @sudhanshugautam2911 in #4574
- fix: change custom data type and add test in node sdk by @jainpawan21 in [https://github.com//pull/450](#4...
v0.20.0
What’s new in Novu 0.20?
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!
0.20 Release Updates
We're thrilled to announce the newest features in our most recent release. Let's get started and explore what's waiting for you!
Global Channel Preferences for Subscribers API
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.
Filters Usage in Digest and Delay Nodes
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
Improved Error Messages In The Workflow Editor
We have improved the error icons and states for each node in the workflow, when no provider is connected or not configured.
SMS & Email Custom Data Overrides
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: "support@novu.co",
// 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
Enabling The Addition of Conditions to Integrations
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: 'john@doemail.com',
},
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.
Mailtrap Email Provider Integration
Now, you can use the Mailtrap Email provider on Novu.
Clicksend SMS Provider Integration
Now, you can use the Clicksend SMS provider on Novu.
All Changes
- refactor: replace node-apns library with parse implementation by @scopsy in #4085
- chore: upgrade mongoose version to 7 by @scopsy in #4106
- feat: init git submodule by @djabarovgeorge in #4049
- Nv 2781 move auth logic to application generic by @djabarovgeorge in #4064
- feat: add external oauth module by @djabarovgeorge in #4067
- chore: fix typo in spf.py by @eltociear in #4083
- Docs overhaul by @sumitsaurabh927 in #3835
- fix: unseen count default by @djabarovgeorge in #4082
- Fix unseen count by @djabarovgeorge in #4084
- Fix plunk missing square logo by @michaldziuba03 in #4087
- fix: unread request by @djabarovgeorge in #4088
- chore: fix typos by @omahs in #4089
- fix: so closing x is in the right place by @davidsoderberg in #4092
- Nv 2679 reusable conditions component by @ainouzgali in #4095
- chore: upgrade vite by @scopsy in #4090
- NV-2765 - 🐛 Bug Report: delay icon is not aligned with other steps icon by @gitstart in #4068
- Nv 2764 e2e tests by @djabarovgeorge in #4094
- fix: missing data prop in the compile payload by @ainouzgali in #4114
- Add ES i18n translations by @luisdoniad in #4110
- fix: select integration with condtions by @davidsoderberg in #4115
- refactor: conditions component by @ainouzgali in #4105
- feat: add nodejs sdk methods in readme by @jainpawan21 in #4047
- fix(ci): inbound mail pipeline indent by @p-fernandez in #4122
- Add Staging Web Pipeline by @Cliftonz in #4108
- Build submodule package by branch by @djabarovgeorge in #4121
- fix: angular version by @sr-26 in #4134
- add volume claim to mongodb deployment by @ahmadzana in #4135
- feat: add missing endpoints by @BiswaViraj in #4103
- fix: run rename by @djabarovgeorge in #4139
- Fix Inbound Mail Deployment by @djabarovgeorge in #4143
- Nv 2826 investigate failing digest tests by @davidsoderberg in [https://github.com...
v0.19.0
What’s new in Novu 0.19?
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!
0.19 Release Updates
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!
Multi-tenancy Management
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.
Tenants Usage in Workflows as Variables
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: 'john@doemail.com',
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
Bulk Subscriber Creation
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: 'test-user@sd.com',
firstName: 'subscriber-1',
lastName: 'test-1',
},
{
subscriberId: 'test-subscriber-2',
email: 'test-user-2@sd.com',
firstName: 'subscriber-2',
lastName: 'test-2',
},
{
subscriberId: 'test-subscriber-3',
},
]);
Addition of Tags in Workflow Settings
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.
Allow Override layout On Trigger
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',
},
});
Show Primary Providers on Workflow Nodes
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!
Enhanced Workflow Nodes Misconfiguration Error
Nodes and workflows will now display mis-configured workflows on the dashboard like so:
All changes
- Nv 2474 styles tag css in email is not showing in few email clients by @davidsoderberg in #3978 - We now convert all email styles to inlince CSS for compatibility across browsers
- fix: so swagger json validates by @davidsoderberg in #3969 - Improved our swagger validation for the API Swagger data
- Reduce count 1000 to the db by @djabarovgeorge in #3993 - Breaking: For socket events we will return
hasMore
boolean field incase there are more than 100 results available. - feat: add tags for workflow settings by @scopsy in #4065 - Tags could now be added to workflows in the workflow settings page, once added they can be used later for usecases such as filtering the user preferences in the notification center
- Nv 2517 displays that workflow has nodes that will fail to send a notification by @BiswaViraj in #3966 - Nodes and workflows will now display mis-configured workflows
- feat: show providers on workflow nodes by @BiswaViraj in #3998 - Providers will be shown on nodes for better identifications
- feat: add override layout in trigger functionality by @ainouzgali in #3961 - You can now override the default layout using the
overrides
part of the trigger - feat(worker): remove performance svc as it was temporary by @p-fernandez in #3944
- Docs platform guide handlebars by @sumitsaurabh927 in #3833
- fix: sidebar intercepting workflow editor by @davidsoderberg in #3968
- feat(wip): initial bulk subscriber create by @ainouzgali in #3938
- Nv 2690 add identifier field to layouts scheme by @ainouzgali in #3956
- feat(ci): reuse instructions to tidy up pipelines by @p-fernandez in #3975
- feat: migration script to add identifier to layouts by @ainouzgali in #3967
- feat(ci): separate the swagger validation in own runner plus improvement by @p-fernandez in #3981
- fix(ci): indenting action by @p-fernandez in #3984
- patch : remove rows only when steps are truthy by @djabarovgeorge in #3980
- Update ReadMe to include Java SDK link by @mayorJAY in #3974
- Add Analytics call to Track Deletion of Templates by @Cliftonz in #3971
- feat add organization id index in integration by @djabarovgeorge in #3983
- fix: so add a provider is not displayed in empty state by @davidsoderberg in #3985
- feat(ci): reusable action to run backend (api, worker) for clients by @p-fernandez in #3991
- fix(ci): proper settings for secrets for run backend by @p-fernandez in #3992
- Changed the sidebar position of Python by @bcsamrudh in #3997
- docs: add nestjs quickstart guide by @michaldziuba03 in #3747
- fix: remove github discussion link by @jainpawan21 in #4002
- feat: fix logger error order by @djabarovgeorge in #4003
- fix: add missing sharable url in the new integration form by @djabarovgeorge in #3986
- next fix logger error order by @djabarovgeorge in #4006
- clean patch - execution details no write concern by @djabarovgeorge in #4008
- optimization : merge two redis calls in api key authenticate by @djabarovgeorge in #3982
- Fix failing test for web and widget by @scopsy in [https://github.com//pull/4009](https://github.co...
v0.18.0
What’s new in Novu 0.18?
TL;DR: All you need to know about the latest Novu 0.18.0 release. General Layout design, multi-provider configuration and more!
0.18 Release Updates
We're excited to unveil the freshest developments in our latest release. Let's plunge right in and uncover what awaits you!
General Layout Design
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.
Multi-provider Configuration
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"}
}
});
Migration for Self-hosted Novu Users - BREAKING CHANGE
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
Plunk Email Provider Integration
Now, you can use the Plunk Email provider on Novu.
All changes
- [New Email Provider]: Add Plunk email provider by @toyosi12 in #3787
- feat: add sort by handlebar helper by @jainpawan21 in #3935
- feat: create novu providers when organization is created by @davidsoderberg in #3843
- feat: add tenants route and shell page component by @djabarovgeorge in #3847
- NV-2601 - Add support in the client for tenant feature by @djabarovgeorge in #3846
- feat: add initial tenants ui by @djabarovgeorge in #3855
- Nv 2612 - Tenant Page Empty State by @djabarovgeorge in #3857
- chore(notification-center,node,shared): update the axios to latest version by @LetItRock in #3861
- fix: remove version 17 info in cookbook by @jainpawan21 in #3862
- fix(app-generic): adding context and information for logs for debugging by @p-fernandez in #3865
- NV 2613 - Tenant Page Pagination by @djabarovgeorge in #3859
- feat: remove get novu integration usecase by @davidsoderberg in #3852
- fix: so activating a provider deactivates novu provider by @davidsoderberg in #3871
- feat: remove novu providers for select provider by @davidsoderberg in #3867
- chore(*): remove
gitHead
field from all packages by @marvinjude in #3868 - NV 2602 - Hide Tenant functionality under the feature flag by @djabarovgeorge in #3860
- Fix broken link by @toyosi12 in #3874
- fix: allow return 'data' as response prop by @djabarovgeorge in #3876
- feat: add subscriber migration dotnet code by @jainpawan21 in #3878
- Nv 2452 tenant create + update a tenant sidebar by @ainouzgali in #3863
- test: fix failing test because of a run on same day by @ainouzgali in #3882
- feat: add delete item and name fields for novu providers by @davidsoderberg in #3864
- feat: add tenant page tests by @djabarovgeorge in #3877
- Stacked PR's Branch for Tenants Support by @djabarovgeorge in #3889
- chore: update cypress version due to security update by @scopsy in #3891
- feat: add migration script to add novu providers to database by @davidsoderberg in #3886
- feat: add few versions fields in bug template by @jainpawan21 in #3906
- chore: update dependencies with security issues by @scopsy in #3901
- fix(app-generic): circular dependency on subscriber pref use cases by @p-fernandez in #3907
- feat: add hover state for provider item by @davidsoderberg in #3903
- fix: add identifier in migration script for novu providers by @davidsoderberg in #3904
- feat: make identifier labels consistent by @davidsoderberg in #3900
- chore(deps): update pnpm to v7.33.4 [security] by @renovate in #3896
- fix: getContextPath did not work correctly when called in a browser by @DaveAtKeelvar in #3814
- Nv 2503 store novu providers email sms in the database by @davidsoderberg in #3898
- Nv 2588 multi provider multiple in app instances can be created by @davidsoderberg in #3910
- feat: render html in in app preview by @davidsoderberg in #3913
- feat: fix cursors for drag buttons and drop area by @davidsoderberg in #3922
- fix: fix update of digest jobs only for current subscriber by @ainouzgali in #3912
- feat(app-generic): add log for subscriber not processed when trigger by @p-fernandez in #3924
- Configure Email provider warning when Novu email provider is active by @djabarovgeorge in #3908
- feat: disable role toggle by @djabarovgeorge in #3929
- fix: icons on the digest playground and in-app sandbox by @BiswaViraj in #3933
- feat(ws): create unit test suite by @p-fernandez in #3921
- New Layout by @BiswaViraj in #3880
- Allow storing custom metadata on the workflow entity by @djabarovgeorge in #3890
- feat(tests): add tests for worker and queue services by @p-fernandez in #3936
- feat(web): select primary integration modal by @LetItRock in #3869
- feat(api): set integration as primary and priority system by @LetItRock in #3873
- chore(api): migration script for primary and priority integration fields by @LetItRock in #3875
- feat(app-generic): add test for add job use case to check the injected queue service by @p-fernandez in #3941
- feat(app-generic): revome queue and worker hardcoded names by @p-fernandez in #3940
- feat(api): notifications feed filtering by partial payload object by @LetItRock in #3939
- feat: get execution details endpoint by external subscriber id by @ainouzgali in #3945
- NV-2664 - Query count change only is the subscriber have connection. by @djabarovgeorge in #3937
- fix(web): fixed env switch popover issue by @LetItRock in #3953
- fix(web): general app layout updates for small and bigger screens by @LetItRock in #3949
New Contributors
- @toyosi12 made their first contribution in #3787
- @marvinjude made their first contribution in #3868
- @DaveAtKeelvar made their first contribution in #3814
Full Changelog: v0.17.2...v0.18.0