<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yubal Torres</title>
    <description>The latest articles on DEV Community by Yubal Torres (@yubaltorres).</description>
    <link>https://dev.to/yubaltorres</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3883412%2F86810aeb-2680-4dee-9fd8-77bd96fa0d03.jpg</url>
      <title>DEV Community: Yubal Torres</title>
      <link>https://dev.to/yubaltorres</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yubaltorres"/>
    <language>en</language>
    <item>
      <title>🚀 Why I built my own push notification tool for CI/CD and Home Assistant</title>
      <dc:creator>Yubal Torres</dc:creator>
      <pubDate>Mon, 22 Jun 2026 16:17:08 +0000</pubDate>
      <link>https://dev.to/yubaltorres/why-i-built-my-own-push-notification-tool-for-cicd-and-home-assistant-527l</link>
      <guid>https://dev.to/yubaltorres/why-i-built-my-own-push-notification-tool-for-cicd-and-home-assistant-527l</guid>
      <description>&lt;p&gt;Nowadays, we all need push notifications. Whether it's for home automation, CI/CD deployments, application monitoring, UniFi Protect, or more.&lt;/p&gt;

&lt;p&gt;But, you'll eventually realize that most of those services don't feature push notifications, or those that do, don't offer a permanent history or tray at all (such as Home Assistant).&lt;/p&gt;

&lt;p&gt;So, I created &lt;a href="https://pulsetray.com" rel="noopener noreferrer"&gt;Pulsetray&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;The idea was simple: I needed an Android app that could receive push notifications with an API request. I wanted to send alerts from my Home Assistant instance, my deployments, database monitoring, and Unifi Protect into one place.&lt;/p&gt;

&lt;p&gt;Most importantly, I wanted a persistent history, a way to organize my notifications by origin or category, and the ability to attach rich media like video footage or screenshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Research
&lt;/h2&gt;

&lt;p&gt;Naturally, my immediate approach was to do a quick Google search and download the first app that popped up. To my surprise, I found two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chat apps&lt;/strong&gt;:  Most people use chat apps for this purpose, such as Telegram or WhatsApp. It works, but it's clunky, you're mixing notifications from all places and you have limited filtering and storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outdated alternatives&lt;/strong&gt;: There are some services out there, but they either look really outdated, lack features, or have a local-only approach. Uninstall the app, upgrade your phone or sign in from a different device and your notifications are gone for good.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Building the solution
&lt;/h2&gt;

&lt;p&gt;At this point, I knew I had a problem that I needed to solve myself, and I wanted to build it as a SaaS for others facing the same friction.&lt;br&gt;
Instead of writing a massive technical deep-dive (I'll save this for a future post), here's a high-level overview of the products I created over the last 8 months:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The app&lt;/strong&gt;: I built the Android app using Kotlin and Kotlin Compose. (Compose is amazing!). This is available in the &lt;a href="https://play.google.com/store/apps/details?id=com.pulsetray.app" rel="noopener noreferrer"&gt;Play Store&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The web dashboard&lt;/strong&gt;: Soon after releasing the initial MVP, I figured that forcing users to download the app to use the service was an important activation problem. I would either have traffic with no interaction, or users downloading the app without using it. I recently deployed a &lt;strong&gt;Web dashboard&lt;/strong&gt; that lets users sign up, configure profiles/devices, send test notifications, setup webhooks, and more. This was deployed to Vercel, and is available on &lt;a href="https://pulsetray.com" rel="noopener noreferrer"&gt;Pulsetray&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The backend&lt;/strong&gt;: This is a monolith (handles both the internal API for the app and dashboard, and the public API for users to trigger notifications) created with Node.js, Express, and TypeScript. For notifications I'm using FCM, of course. This was deployed to Render (and PlanetScale for the MySQL database).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The features
&lt;/h2&gt;

&lt;p&gt;What started as a simple POST request endpoint and an Android app has grown into a much more mature platform. I recently deployed a &lt;strong&gt;Web Dashboard&lt;/strong&gt; and &lt;strong&gt;Incoming Webhooks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's what Pulsetray can do right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple API&lt;/strong&gt;: Trigger notifications with a standard POST request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Profiles and devices&lt;/strong&gt;: You can add more people to your account, and devices. You can onboard devices using a unique token. Notifications can be sent to the entire account, or specific profiles and devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-app notifications tray&lt;/strong&gt;: Have persistent and searchable history of notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rich media support&lt;/strong&gt;: You can attach an image, video or GIF when sending a notification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly customizable&lt;/strong&gt;: Each notification can have title, body, rich media, and more. They can also be assigned a &lt;strong&gt;source&lt;/strong&gt; (e.g. Home Assistant, GitHub, Unifi, etc.) and a &lt;strong&gt;category&lt;/strong&gt; (e.g. Deployment, Camera, Log, etc.) for easy filtering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;: You can trigger notifications with incoming webhooks by just pasting a URL into services like GitHub, Vercel or Sentry. You can configure the title, body, image, targets, and even extract specific information from the JSON body using dot notation to format your notification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free plan&lt;/strong&gt;: I designed the Free plan to be as generous as possible, offering enough notification limits for most people, no bank details required. Paid plans are available for users needing higher limits to help sustain the service.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;

&lt;p&gt;Code is worth more than a thousand words, so here's how simple it is to send a notification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -X POST https://api.pulsetray.com/v1/notifications \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
  "title": "Script finished running",
  "body": "Production DB backup finished running"
}'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Documentation:
&lt;a href="https://pulsetray.com/docs/docs" rel="noopener noreferrer"&gt;https://pulsetray.com/docs/docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feedback!
&lt;/h2&gt;

&lt;p&gt;My goal is to keep improving the project, so your feedback will be more than welcome! Right now the very next step I have in sight is creating the iOS counterpart, but please, give me your thoughts, suggestions, or questions you may have.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>programming</category>
      <category>showdev</category>
      <category>software</category>
    </item>
  </channel>
</rss>
