Skip to content

Releases: RecurPixel/Notify

v0.2.0

24 Mar 16:31

Choose a tag to compare

RecurPixel.Notify v0.2.0 — Stable Release

🎉 STABLE RELEASE — Production ready with 35+ notification adapters across 13+ channels

What's New

  • 21 new or restructured packages — complete channel expansion
  • Zero SaaS dependency — pure .NET library, full control
  • Auto-discovery — install package, configure credentials, go
  • DI-native — single AddRecurPixelNotify() call
  • Delivery hooks — custom logging to your database
  • Retry with backoff — built-in resilience
  • Fallback chains — automatic failover between providers
  • Scoped service support — DbContext and scoped dependencies work

Adapter Coverage

All adapters validated and production-ready:

Package Provider Channel Unit Tested Integration Tested
Email.SendGrid Twilio SendGrid Email
Email.Smtp Any SMTP Email
Sms.Twilio Twilio SMS
Push.Fcm Firebase Push
Slack Slack Webhooks Team Chat
Discord Discord Webhooks Team Chat
Teams Microsoft Teams Team Chat 🔲
Telegram Telegram Bot API Social
WhatsApp.Twilio Twilio WhatsApp WhatsApp
InApp Hook-based In-App
...and 25 more adapters

See changelogs/CHANGELOG.md for complete list and breaking changes from beta.

What's Next: v0.3.0

Roadmap includes:

  • Dashboard Package — delivery tracking and observability
  • Notification Log — queryable delivery history
  • Bulk Batch Grouping — group related notifications
  • REST API — query delivery logs and trigger notifications
  • Circuit Breaker — automatic provider failover on sustained failures

See v0.3.0-DASHBOARD-PLAN.md for detailed architecture.

v0.2.0-beta.2 — CI Fix

06 Mar 14:37

Choose a tag to compare

Pre-release

Fixes

  • Fixed GitHub Actions integration tests configuration loading
  • appsettings.integration.json is now optional in CI — tests gracefully skip when credentials are missing

Status: Ready for NuGet publication

v0.2.0-beta.1

06 Mar 12:36

Choose a tag to compare

v0.2.0-beta.1 Pre-release
Pre-release

[0.2.0-beta.1] — March 2026

New Packages

  • RecurPixel.Notify — merged meta-package replacing the separate Core + Orchestrator install
  • RecurPixel.Notify.Email.AzureCommEmail
  • RecurPixel.Notify.Sms.AzureCommSms
  • RecurPixel.Notify.Mattermost
  • RecurPixel.Notify.RocketChat

Breaking Changes

  • TriggerAsync return type — now returns TriggerResult with IReadOnlyList<NotifyResult> ChannelResults, AllSucceeded, AnySucceeded, and Failures for per-channel inspection
  • BulkTriggerAsync return type — now returns BulkTriggerResult with one TriggerResult per input context
  • TriggerResult / BulkTriggerResult moved to Core — namespace is now RecurPixel.Notify.Core.Models
  • Package restructureRecurPixel.Notify is now the primary install (Core + Orchestrator). Users of beta.1 should remove RecurPixel.Notify.Core and RecurPixel.Notify.Orchestrator and add RecurPixel.Notify
  • Core setup method renamedAddRecurPixelNotify in Core renamed to AddNotifyOptions to avoid confusion with the Orchestrator overload
  • InAppOptions.OnDeliver renamed to UseHandler — aligns with the handler-as-implementation pattern
  • Dead properties removedNotifyOptions.OnDelivery and NotifyOptions.InApp removed; use OrchestratorOptions.OnDelivery and AddInAppChannel respectively
  • Namespace reorganization — Major cleanup for cleaner public API surface:
    • Models (NotificationPayload, NotifyResult, BulkNotifyResult, NotifyContext, NotifyUser) moved from RecurPixel.Notify.Core.ModelsRecurPixel.Notify
    • Channel interfaces and bases (INotificationChannel, NotificationChannelBase, ChannelAdapterAttribute) moved from RecurPixel.Notify.Core.ChannelsRecurPixel.Notify.Channels
    • Core options (NotifyOptions, RetryOptions, FallbackOptions, BulkOptions) moved from RecurPixel.Notify.Core.OptionsRecurPixel.Notify
    • Channel-specific options (EmailOptions, SmsOptions, PushOptions, WhatsAppOptions) and all provider credential options moved from RecurPixel.Notify.Core.Options.*RecurPixel.Notify.Configuration
    • All public channel implementation classes moved to RecurPixel.Notify.Channels (e.g., SendGridChannel, SlackChannel, TwilioSmsChannel, etc.)
    • Services (INotifyService, NotifyService) moved from RecurPixel.Notify.Orchestrator.ServicesRecurPixel.Notify
    • All adapter ServiceCollectionExtensions moved from RecurPixel.Notify.[Channel].[Provider]RecurPixel.Notify

Bug Fixes

  • Simple channel registration key mismatch — all simple channels (InApp, Slack, Discord, Teams, Telegram, Facebook, Line, Viber, Mattermost, RocketChat) now register and resolve as "channel:default"
  • IOptions<NotifyOptions> not registered — both raw NotifyOptions POCO and IOptions<NotifyOptions> are now registered; ChannelDispatcher receives the correct options
  • Adapter credentials not reaching DIConfigureAllKnownOptions now maps every provider's credentials from the NotifyOptions POCO into IOptions<TAdapterOptions> at startup; adapters constructed by DI receive real credentials instead of empty defaults
  • Telegram ChatId fallbackTelegramChannel now falls back to TelegramOptions.ChatId when payload.To is empty, with a clear error if neither is set
  • Misleading XML doc on AddSmtpChannel — corrected; the method is not called internally by AddRecurPixelNotify

DX Improvements

  • Single setup callAddRecurPixelNotify(Action<NotifyOptions>, Action<OrchestratorOptions>) combines options binding, adapter auto-registration, and orchestrator setup in one call
  • Auto-registration via assembly scanning — install a provider package and configure its credentials; no Add{X}Channel() call required. [ChannelAdapter] attribute drives discovery at startup
  • Config-filtered registration — only adapters with credentials present in NotifyOptions are registered; unconfigured providers have zero DI footprint
  • Startup validationValidateActiveProviders throws InvalidOperationException at startup when Provider is set but credentials are missing — never silently at send time
  • OnDelivery composable — multiple OnDelivery / OnDelivery<TService> registrations are additive; all handlers fire in registration order
  • OnDelivery<TService> scoped resolution — creates a fresh DI scope per call; DbContext and other scoped services are safe to use directly without IServiceScopeFactory
  • AddInAppChannel + UseHandler<TService> — InApp delivery wired via a typed scoped handler; OnDelivery remains a separate audit hook
  • Silent no-send warningNotifyService logs a warning when a channel is in the event definition but has no payload in NotifyContext.Channels
  • Improved ResolveAdapter error — multi-cause diagnostic message when a channel adapter key is not found in DI
  • INotifyService channel properties — added Line, Viber, Mattermost, RocketChat direct channel properties
  • All adapter extensions use TryAddKeyedSingleton — idempotent; explicit Add{X}Channel() calls and auto-registration no longer conflict

Documentation

  • All docs updatedgetting-started.md, usage-tiers.md, quick-start.md, features.md rewritten to reflect current API
  • New examples.md — Tier 1 (single-channel OTP), Tier 2 (e-commerce), Tier 3 (full SDK), and a production-ready pattern with InApp + OnDelivery + event definitions
  • Scoped services pattern documentedOnDelivery<TService> and UseHandler<TService> DI scope behaviour explained
  • UseChannels key names documented — logical channel names only ("email", "sms"), not provider names

v0.1.0-beta.1

19 Feb 16:49

Choose a tag to compare

v0.1.0-beta.1 Pre-release
Pre-release

RecurPixel.Notify v0.1.0-beta.1

First public beta release.

Install

dotnet add package RecurPixel.Notify.Sdk --version 0.1.0-beta.1 --prerelease

Or install individual adapters:

dotnet add package RecurPixel.Notify.Email.SendGrid --version 0.1.0-beta.1 --prerelease

Packages (34)

Core

  • RecurPixel.Notify.Core — Core interfaces, models, and base classes
  • RecurPixel.Notify.Orchestrator — Event system, TriggerAsync, retry, fallback, conditions
  • RecurPixel.Notify.Sdk — Full SDK meta-package (all channels included)

Email

  • RecurPixel.Notify.Email.SendGrid
  • RecurPixel.Notify.Email.Smtp
  • RecurPixel.Notify.Email.Mailgun
  • RecurPixel.Notify.Email.Postmark
  • RecurPixel.Notify.Email.Resend
  • RecurPixel.Notify.Email.AwsSes
  • RecurPixel.Notify.Email.AzureCommEmail

SMS

  • RecurPixel.Notify.Sms.Twilio
  • RecurPixel.Notify.Sms.Vonage
  • RecurPixel.Notify.Sms.Plivo
  • RecurPixel.Notify.Sms.Sinch
  • RecurPixel.Notify.Sms.MessageBird
  • RecurPixel.Notify.Sms.AwsSns
  • RecurPixel.Notify.Sms.AzureCommSms

Push

  • RecurPixel.Notify.Push.Fcm
  • RecurPixel.Notify.Push.Apns
  • RecurPixel.Notify.Push.Expo
  • RecurPixel.Notify.Push.OneSignal

WhatsApp

  • RecurPixel.Notify.WhatsApp.Twilio
  • RecurPixel.Notify.WhatsApp.MetaCloud
  • RecurPixel.Notify.WhatsApp.Vonage

Chat & Social

  • RecurPixel.Notify.Slack
  • RecurPixel.Notify.Discord
  • RecurPixel.Notify.Teams
  • RecurPixel.Notify.Telegram
  • RecurPixel.Notify.Facebook
  • RecurPixel.Notify.Line
  • RecurPixel.Notify.Viber
  • RecurPixel.Notify.Mattermost
  • RecurPixel.Notify.RocketChat

Other

  • RecurPixel.Notify.InApp

Targets

  • net8.0 (LTS)
  • net10.0 (LTS)
  • Core also supports netstandard2.1

Note

This is a pre-release beta. The public API is stable but may change based on feedback before v1.0.0.
Report issues at https://github.com/RecurPixel/Notify/issues