<?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>Setting up a persistent notifications tray for Home Assistant</title>
      <dc:creator>Yubal Torres</dc:creator>
      <pubDate>Mon, 29 Jun 2026 06:57:15 +0000</pubDate>
      <link>https://dev.to/yubaltorres/setting-up-a-persistent-notifications-tray-for-home-assistant-4djk</link>
      <guid>https://dev.to/yubaltorres/setting-up-a-persistent-notifications-tray-for-home-assistant-4djk</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: This tutorial will use Pulsetray, a tool I've developed myself.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you use Home Assistant, you probably send notifications to your phone using the Companion App. It's great for letting you know when a door opens or a camera sees motion, but it has one problem I hated: There's no notifications tray.&lt;/p&gt;

&lt;p&gt;While the Companion App notifications are highly customizable, they don't get stored anywhere. Once you dismiss an alert from your phone, it's gone forever.&lt;/p&gt;

&lt;p&gt;I wanted a persistent searchable history of notifications, so I built a tool to fix it. This tutorial will show you how to setup an Android app to centralize your Home Assistant notifications, along with categories, rich media and a permanent history. You can even extend this to other platforms you'd like to monitor, like GitHub, UniFi Protect, and more.&lt;/p&gt;

&lt;p&gt;Let's dive in!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install and configure Pulsetray
&lt;/h3&gt;

&lt;p&gt;First, we need to set up the app to receive alerts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the &lt;a href="https://play.google.com/store/apps/details?id=com.pulsetray.app" rel="noopener noreferrer"&gt;Pulsetray&lt;/a&gt; app from the Play Store and complete the sign up process.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;API keys&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add API key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter a name and click on &lt;strong&gt;Add key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy the generated &lt;strong&gt;Token&lt;/strong&gt; immediately. You will use this token to authorize POST requests from Home Assistant, and this is the only time it'll be visible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fblqtgf0jdo1w2rz6pbiq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fblqtgf0jdo1w2rz6pbiq.png" alt="API key section in Pulsetray app" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the app being all set, let's move onto Home Assistant.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Setup a rest_command in Home Assistant
&lt;/h3&gt;

&lt;p&gt;Next, we need to prepare Home Assistant to allow it to &lt;em&gt;talk&lt;/em&gt; to Pulsetray. We will do this by creating a &lt;code&gt;rest_command&lt;/code&gt; in your &lt;code&gt;configuration.yaml&lt;/code&gt; file, which allows Home Assistant to send HTTP requests to external APIs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your &lt;code&gt;configuration.yaml&lt;/code&gt; file (you can use the &lt;a href="https://www.home-assistant.io/docs/configuration/#editing-configurationyaml" rel="noopener noreferrer"&gt;File Editor add-on&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Append the YAML block shown below to the end of the file.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;YOUR_TOKEN&lt;/code&gt; with the API token you copied in the previous step.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rest_command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pulsetray&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.pulsetray.com/v1/notifications"&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;post&lt;/span&gt;
    &lt;span class="na"&gt;content_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json"&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;YOUR_TOKEN"&lt;/span&gt;
    &lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;json_body&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to_json&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;payload: "{{ json_body | to_json }}"&lt;/code&gt; line allows us to define the specific contents of the notification later when we create our automation.&lt;/p&gt;

&lt;p&gt;Save the file and &lt;strong&gt;restart your Home Assistant instance&lt;/strong&gt; to apply the changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create the automation
&lt;/h3&gt;

&lt;p&gt;Once Home Assistant reboots, we can set up the actual trigger. For this example, I'll configure an alert that fires when my Samsung fridge door has been left open for more than 30 seconds.&lt;/p&gt;

&lt;p&gt;In Home Assistant, go to &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Automations &amp;amp; scenes&lt;/strong&gt; &amp;gt; &lt;strong&gt;+ Create automation&lt;/strong&gt; &amp;gt; &lt;strong&gt;Create new automation&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The trigger (When)
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;+ Add trigger&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Device&lt;/strong&gt; and choose your specific device (e.g. Fridge)&lt;/li&gt;
&lt;li&gt;Select the trigger action (e.g. &lt;strong&gt;Fridge door opened&lt;/strong&gt;) and set the duration to &lt;strong&gt;30 seconds&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9vj0hlcgx90etw4b1dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9vj0hlcgx90etw4b1dm.png" alt="Home Assistant trigger configuration" width="575" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The action (Then do)
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Click on &lt;strong&gt;+Add action&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for and select &lt;strong&gt;RESTful Command: pulsetray&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;three dots&lt;/strong&gt; in the corner of the action and select &lt;strong&gt;Edit in YAML&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste the following YAML code to define your notification payload:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rest_command.pulsetray&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;json_body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fridge door is open&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fridge door has been open for more than 30 seconds&lt;/span&gt;
    &lt;span class="na"&gt;androidConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;high&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mrerllcplwu1cot8zjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mrerllcplwu1cot8zjp.png" alt="Home Assistant automation configuration" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Done! You can now save the automation. To test the action, click the three dots at the top of the automation and select &lt;strong&gt;Run actions&lt;/strong&gt;. You  should receive a notification to your phone instantly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3e6zjmd6ii7vgczlpa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa3e6zjmd6ii7vgczlpa4.png" alt="Notification received" width="800" height="374"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus! Organizing with Categories
&lt;/h3&gt;

&lt;p&gt;Centralizing notifications is great, but a flat list can get messy really quickly. To separate and filter our alerts, we'll use &lt;strong&gt;sources&lt;/strong&gt; and &lt;strong&gt;categories&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the Pulsetray app, go to &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Sources and categories&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+ Add source&lt;/strong&gt;. Set the code to &lt;code&gt;home-assistant&lt;/code&gt;, and the name to &lt;code&gt;Home Assistant&lt;/code&gt;. Save it.&lt;/li&gt;
&lt;li&gt;In the source you've just created, click on &lt;strong&gt;+ Add category&lt;/strong&gt;. Set the code to &lt;code&gt;fridge&lt;/code&gt; and the name to &lt;code&gt;Fridge&lt;/code&gt;. Save it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkgu0rvsz6ixtfv0ihxm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkgu0rvsz6ixtfv0ihxm8.png" alt="Source in Pulsetray app" width="800" height="1423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, go back to your Home Assistant automation and update your YAML action to include the new codes we've created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rest_command.pulsetray&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;json_body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fridge door is open&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fridge door has been open for more than 30 seconds&lt;/span&gt;
    &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;home-assistant&lt;/span&gt;
    &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;fridge&lt;/span&gt;
    &lt;span class="na"&gt;androidConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;priority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;high&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the automation, and you're good to go! You'll now be able to filter and separate your notifications at a glance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxcpt7y8tzkx8sgokvfjg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxcpt7y8tzkx8sgokvfjg.png" alt="Pulsetray notification" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;I built this tool to solve a problem I had, and I hope more people find it useful. You can integrate it with any service that supports POST requests or webhooks, like Vercel, GitHub or UniFi Protect.&lt;/p&gt;

&lt;p&gt;To find more usages and customization, you can take a look at the &lt;a href="https://pulsetray.com/docs/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have any questions or suggestions please let me know!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>showdev</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <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>
