Pulse

Self-hosted notification gateway to send chat, email, push and SMS messages through a single API.

Notifications

One API to notify them all

Fusio Pulse is an open-source, self-hosted notification gateway. It wraps the Symfony Notifier component behind a simple REST API, so any application, regardless of its language, can send chat, email, push and SMS messages through a single HTTP call.

You configure your provider, i.e. Twilio, Slack or SendGrid, through a DSN and your apps only talk to Pulse. Switching a provider is a single configuration change, your client code stays the same. Since Pulse is built on Fusio you get authentication, scopes, rate limiting and logging out of the box.

Send an SMS
curl -X POST https://pulse.example.com/sms \
  -H "Authorization: Bearer [TOKEN]" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+4917612345678",
    "subject": "Your verification code is 123456"
  }'

The SMS is delivered through the provider configured in the SMS_DSN environment variable, i.e. twilio://SID:TOKEN@default?from=FROM.

Features

Pulse focuses on being a small and simple gateway which you fully control. If you need complex workflows or an in-app inbox, take a look at a full notification platform.

One API, four channels

Send chat, email, push and SMS messages through a consistent JSON API.

No vendor lock-in

Switch from Twilio to Vonage or from SendGrid to Postmark by changing a single DSN.

Self-hosted

Your messages never pass through a third party platform and there are no per-message fees.

Access control

Every channel has its own scope, so you decide which app is allowed to use which channel.

Events

Every sent message triggers a CloudEvent, which you can subscribe to through a webhook.

Docker ready

Run Pulse through the fusio/pulse image, i.e. on your own server with Plant.

Swap providers, not code

Pulse uses the battle-tested Symfony Notifier bridges to deliver your messages. Each channel is configured through an environment variable which contains the DSN of your provider. A channel without a DSN is simply disabled.

Provider specific settings, i.e. Slack blocks or the Expo push token, can be passed through the options field of the request. Additional providers can be added by requiring the fitting Symfony bridge. Pulse can also be self-hosted with Plant.

Endpoint Providers
POST /chatSlack, Discord, Microsoft Teams, Telegram, Google Chat
POST /emailSendGrid, Mailgun, Amazon SES, Postmark, Resend
POST /pushExpo, OneSignal, Novu
POST /smsTwilio, Vonage, Sinch, Infobip, Telnyx
SHA1 a75b35a1a4900f362fe505d06092bad50cc97067