惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
D
DataBreaches.Net
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
腾讯CDC
博客园_首页
The Cloudflare Blog
S
SegmentFault 最新的问题
C
Check Point Blog
美团技术团队
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
🚀 Why I built my own push notification tool for CI/CD and...
Yubal Torres · 2026-06-23 · via DEV Community

Yubal Torres

Nowadays, we all need push notifications. Whether it's for home automation, CI/CD deployments, application monitoring, UniFi Protect, or more.

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).

So, I created Pulsetray

The problem

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.

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.

Research

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:

  1. Chat apps: 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.
  2. Outdated alternatives: 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.

Building the solution

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.
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:

  • The app: I built the Android app using Kotlin and Kotlin Compose. (Compose is amazing!). This is available in the Play Store.
  • The web dashboard: 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 Web dashboard that lets users sign up, configure profiles/devices, send test notifications, setup webhooks, and more. This was deployed to Vercel, and is available on Pulsetray.
  • The backend: 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).

The features

What started as a simple POST request endpoint and an Android app has grown into a much more mature platform. I recently deployed a Web Dashboard and Incoming Webhooks.

Here's what Pulsetray can do right now:

  • Simple API: Trigger notifications with a standard POST request.
  • Profiles and devices: 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.
  • In-app notifications tray: Have persistent and searchable history of notifications.
  • Rich media support: You can attach an image, video or GIF when sending a notification.
  • Highly customizable: Each notification can have title, body, rich media, and more. They can also be assigned a source (e.g. Home Assistant, GitHub, Unifi, etc.) and a category (e.g. Deployment, Camera, Log, etc.) for easy filtering.
  • Webhooks: 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.
  • Free plan: 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.

The code

Code is worth more than a thousand words, so here's how simple it is to send a notification:

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"
}'

That's it!

Links

Feedback!

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.