In very simple terms, you have an app installed on your phone (ntfy) that creates a websocket connection to your ntfy server and waits for notifications. The ntfy server receives these notifications from your Application Backend (via HTTP POST), which would normally send these to Firebase. Then your ntfy app receives the notification and can broadcast these to other apps, which could be your Application that earlier talked to some google services to receive notifications.
The whole point of unifiedpush is, that earlier when people did not want to use Google services in their application, they all needed to listen/poll on their own to some endpoint from the Application backend, which can be quite battery draining when you have multiple apps that do this. With ntfy you have only one app that listens/polls for these and can efficiently send them to the apps which want these notifications, exactly like Google Firebase notifications
The whole point of unifiedpush is, that earlier when people did not want to use Google services in their application, they all needed to listen/poll on their own to some endpoint from the Application backend, which can be quite battery draining when you have multiple apps that do this. With ntfy you have only one app that listens/polls for these and can efficiently send them to the apps which want these notifications, exactly like Google Firebase notifications