LOADING...
A native Windows 10/11 app that relays Windows toast notifications to HTTP webhooks in real time.
WinToastRelay is a native Windows 10/11 app that relays Windows toast notifications to a configured destination in real time.
Get it from Microsoft
WinToastRelay uses Windows.UI.Notifications.Management.UserNotificationListener and its NotificationChanged event. It does not use a timer or polling loop. When the listener starts, the notification center is enumerated once to establish a baseline; each subsequent event is handled individually by its notification ID.
Requirements:
The project is intentionally packaged because the Windows notification listener requires an interactive packaged identity. On first use, configure a valid delivery destination and approve notification access when Windows prompts you. Listening starts automatically after configuration.
Create a local code-signing certificate once. The generated files are ignored by Git and will not be committed to the repository.
The package requests one capability: . This capability is required for the packaged WinUI 3 desktop executable and its optional Windows startup task; it does not grant notification-listener access. Access to Windows notifications is requested separately at runtime through , and the user may deny or later revoke that permission.
Create a temporary certificate whose Subject matches the reserved Store Publisher and use it only during packaging:
Upload the resulting from the directory under Manage packages in Partner Center. Do not upload the ; Microsoft Store replaces the package signature after the submission is accepted.
For local sideloading, run the generated from the package output directory and allow it to install the matching into the Local Computer → Trusted People certificate store. You can also import the manually with administrator approval. The temporary certificate includes the non-CA Basic Constraints extension required for MSIX sideloading. Do not publish the temporary PFX or CER as a public signing identity; Microsoft Store replaces the signature for Store distribution.
Use the and from the same output directory. If Windows reports or during local sideloading, import the matching into Local Computer → Trusted People, then install the corresponding .
Enter a Bark server URL and device key. WinToastRelay sends a JSON POST request to the server's endpoint:
Title and body templates support , , , , , and . You can add arbitrary Bark parameters in the app settings, one entry per line. Oversized payload text is truncated before delivery to stay within the configured payload limit.
Create an application in the WxPusher console, then enter its AppToken and at least one recipient UID or numeric Topic ID. UIDs and Topic IDs can be separated by new lines, commas, or semicolons. WinToastRelay sends plain-text messages through ; summary and content templates support the same variables as Bark.
The AppToken is stored in Windows Credential Manager. A request is considered delivered only when the HTTP response succeeds, the top-level WxPusher business response code is , and every recipient result is successful. Configuration supports up to 2,000 UIDs and 5 Topic IDs per request; both recipient types may be used together. See the WxPusher standard push API documentation for application and recipient setup.
The header contains the same delivery ID, making receiver-side deduplication straightforward. Transient failures (timeouts, 429 responses, 5xx responses, and temporary WxPusher business errors) are persisted locally and retried with exponential backoff. Other failed responses are persisted as dead letters and reported in the activity view for the active session.
Delivery sends the visible notification text, source application display name, and creation time to the configured Bark, WxPusher, or JSON webhook destination. Review the destination's data retention and access policies before relaying sensitive notifications. The WxPusher AppToken and optional webhook Bearer token are stored only in Windows Credential Manager.
MIT
RequestAccessAsyncglobal.jsonrunFullTrustUserNotificationListener.RequestAccessAsync.msixbundleAppPackages.cerAdd-AppDevPackage.ps1.cer.cer.msix.cer0x800B01090x87e80034.cer.msix/push{app}{title}{body}{id}{eventType}{createdAt}key=valuePOST https://wxpusher.zjiecode.com/api/send/message1000X-WinToastRelay-Deliverydotnet restore .\WinToastRelay.csproj -r win-x64
dotnet build .\WinToastRelay.csproj -r win-x64 -p:Platform=x64
dotnet test .\tests\WinToastRelay.Tests\WinToastRelay.Tests.csproj.\scripts\New-DevCertificate.ps1 `
-Subject "CN=184C7048-0661-4259-8EE3-39EFE462DFBE" `
-OutputName "WinToastRelay-store-upload" `
-Password "choose-a-temporary-password" `
-ValidYears 1
dotnet publish .\WinToastRelay.csproj -r win-x64 -p:Platform=x64 -p:Configuration=Release `
-p:GenerateAppxPackageOnBuild=true -p:AppxBundle=Always -p:AppxBundlePlatforms=x64 `
-p:PackageCertificateKeyFile="$PWD\certs\WinToastRelay-store-upload.pfx" `
-p:PackageCertificatePassword="choose-a-temporary-password"{
"device_key": "your-device-key",
"title": "Example app: A title",
"body": "Notification body",
"sound": "bell",
"group": "work"
}{
"eventType": "notification.added",
"deliveryId": "a-generated-id",
"notification": {
"id": 123,
"app": "Example app",
"title": "A title",
"body": "Notification body",
"createdAt": "2026-08-20T00:00:00Z"
}
}