Notifications look simple at first—until your app grows. You start by sending a quick email from a controller, but soon you need more:


Email and in-app notifications.
Different channels depending on user preferences.
Queued delivery so the UI stays fast.
Clean tests that don't actually hit your SMTP server.


That is exactly where...