Skip to content

Research: Sending Cross-Platform Toast Notifications and Push Notifications #42

@sirkirby

Description

@sirkirby

Research: Sending Notifications in a Cross-Platform .NET CLI Application

Local System Notifications

  • Windows: Use the Windows Community Toolkit (Microsoft.Toolkit.Uwp.Notifications) to trigger toast notifications. The library provides APIs for constructing and showing notifications on Windows 10+.
  • macOS: Use osascript to invoke the macOS Notification Center with a message: osascript -e 'display notification "Message" with title "Title"'.
  • Linux: Use the notify-send command (libnotify) to send desktop notifications on GNOME and other desktop environments.

Sample Helper Method

Here is a simple helper method illustrating a cross platform approach using System.Runtime.InteropServices.RuntimeInformation to detect the operating system and call the appropriate command:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

public static class Notifier
{
    public static void Notify(string title, string message)
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            // Use PowerShell to invoke Windows toast notifications
            Process.Start(new ProcessStartInfo("powershell", $"-Command \"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType=WindowsRuntime]; "
                + "$template = [Windows.UI.Notifications.ToastTemplateType]::ToastText02; "
                + "$xml = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent($template); "
                + "$xml.GetElementsByTagName('text')[0].AppendChild($xml.CreateTextNode('{title}')) | Out-Null; "
                + "$xml.GetElementsByTagName('text')[1].AppendChild($xml.CreateTextNode('{message}')) | Out-Null; "
                + "[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('MyApp').Show((New-Object Windows.UI.Notifications.ToastNotification $xml))\"")
            { CreateNoWindow = true });
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
        {
            // Use AppleScript (osascript) on macOS
            Process.Start("osascript", $"-e 'display notification \"{message}\" with title \"{title}\"'");
        }
        else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            // Use notify-send on Linux
            Process.Start("notify-send", $"\"{title}\" \"{message}\"");
        }
    }
}

Remote / Push Notifications

If your CLI needs to notify remote users or services, integrate with messaging services like:

  • Slack, Microsoft Teams, Discord via webhooks or bot APIs.
  • Email providers such as SendGrid, Amazon SES, or using SMTP via MailKit.
  • Push notification services such as Firebase Cloud Messaging (FCM) or OneSignal for mobile/web push.
  • SMS via providers like Twilio.

For example, sending a Slack message through an Incoming Webhook can be done with HttpClient:

using System.Net.Http;
using System.Text;
using System.Threading.Tasks;

public static class SlackNotifier
{
    public static async Task NotifyAsync(string webhookUrl, string message)
    {
        using var client = new HttpClient();
        var payload = new StringContent($"{{\"text\": \"{message}\"}}", Encoding.UTF8, "application/json");
        await client.PostAsync(webhookUrl, payload);
    }
}

Cross Platform Abstractions

Some libraries provide a unified abstraction for notifications:

  • Avalonia.Notifications: Works with the Avalonia UI framework to show native notifications across platforms.
  • Spectre.Console: Provides rich console rendering; while not system notifications, it can be used to display transient alerts within a CLI in a cross platform way.

Recommendation

For a cross platform .NET CLI:

  1. Implement an INotificationService interface with methods such as NotifyLocal and NotifyRemote.
  2. Provide OS specific implementations for local notifications (e.g., via shell commands shown above).
  3. Integrate remote notifications through configurable services (Slack, email, SMS) using environment variables or configuration for endpoints.
  4. Fall back to console output when no notification mechanism is available.

This issue captures the research on sending notifications from a cross platform .NET CLI, outlining both local system notifications and remote messaging options.

Metadata

Metadata

Assignees

Labels

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions