<?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: omer alpi</title>
    <description>The latest articles on DEV Community by omer alpi (@omeralpi).</description>
    <link>https://dev.to/omeralpi</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%2F3192937%2Fcb197f5f-e682-42df-b251-247409cc6e65.jpg</url>
      <title>DEV Community: omer alpi</title>
      <link>https://dev.to/omeralpi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omeralpi"/>
    <language>en</language>
    <item>
      <title>App notifications without another script to maintain</title>
      <dc:creator>omer alpi</dc:creator>
      <pubDate>Mon, 12 Oct 2026 20:04:39 +0000</pubDate>
      <link>https://dev.to/omeralpi/app-notifications-without-another-script-to-maintain-5c50</link>
      <guid>https://dev.to/omeralpi/app-notifications-without-another-script-to-maintain-5c50</guid>
      <description>&lt;p&gt;I build several products on my own. AI has made it much easier to start another one, which is great until I remember how many things I already have running.&lt;/p&gt;

&lt;p&gt;The part that bothers me is being out of the loop. I can be working on one app while another gets a new customer, stops responding, or starts costing more to host. I want to know. I don’t want to spend every break checking dashboards.&lt;/p&gt;

&lt;p&gt;Cloud bills are a particular irritation. If I’ve bothered to set a budget warning, I want it somewhere I’ll notice it. An email I haven’t opened isn’t much help to me.&lt;/p&gt;

&lt;p&gt;That was the starting point for &lt;a href="https://appkeepr.com/" rel="noopener noreferrer"&gt;Appkeepr&lt;/a&gt;, which I’m building: connect the services behind my apps and let the important updates reach my phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  I can write the handler. I don’t want another project.
&lt;/h2&gt;

&lt;p&gt;A webhook endpoint and a call to a notification API are straightforward enough. So are &lt;a href="https://ntfy.sh/" rel="noopener noreferrer"&gt;ntfy&lt;/a&gt; and &lt;a href="https://pushover.net/" rel="noopener noreferrer"&gt;Pushover&lt;/a&gt; if they fit what you need. Sending a message isn’t the hard part.&lt;/p&gt;

&lt;p&gt;For me, the annoying work starts with the second service, or the next app. Each source has its own events. I have to decide what to forward, keep the product name attached, and look after whatever code I’ve deployed to join it all together. AI can help write that code; I still own it afterwards.&lt;/p&gt;

&lt;p&gt;I wanted this to be a setup task I could finish and leave alone for a while.&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%2Fo1cydojmfungssza0myt.png" class="article-body-image-wrapper"&gt;&lt;img width="800" 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%2Fo1cydojmfungssza0myt.png" alt="Provider logos connect through a no-code arrow to a cropped phone showing Trial converted and API down." height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With RevenueCat, I choose a channel in Appkeepr, paste the connection’s webhook URL into RevenueCat, and select the events I want. There’s no custom handler to deploy. The &lt;a href="https://appkeepr.com/docs/integrations/revenuecat" rel="noopener noreferrer"&gt;connection guide&lt;/a&gt; has the details if you want to try it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which app is this about?
&lt;/h2&gt;

&lt;p&gt;A message saying someone subscribed is nice. When I’m running several products, I also need to know which one they subscribed to. Assigning the connection to a project keeps that name with the message.&lt;/p&gt;

&lt;p&gt;These are example messages from the &lt;a href="https://appkeepr.com/#inbox" rel="noopener noreferrer"&gt;demo&lt;/a&gt;:&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%2Fuqzl0zn1ry99a0c65nri.png" class="article-body-image-wrapper"&gt;&lt;img width="799" 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%2Fuqzl0zn1ry99a0c65nri.png" alt="Two example Inbox messages: a trial converted in nastea, and feedback about a mobile checkout problem in revos." height="380"&gt;&lt;/a&gt;&lt;/p&gt;
A new customer in one app. A checkout problem in another.



&lt;p&gt;I’d open the checkout report first. It doesn’t tell me why checkout failed, but I know which product to investigate. I’d be happy to receive the purchase message too. Someone deciding to pay for something I made is news I care about, even when there’s nothing to fix.&lt;/p&gt;

&lt;p&gt;Messages from the channels I subscribe to appear together in my Inbox. New messages can also reach my phone with push notifications enabled. Later, I can open the same message on the web; the read state stays in sync.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bill keeps growing too
&lt;/h2&gt;

&lt;p&gt;This is one alert I want on my phone. I want to know when cloud costs rise, even while I’m focused on another product.&lt;/p&gt;

&lt;p&gt;Take a $50 budget warning as an example. If the provider sends it, I want to see it and decide whether that spend makes sense.&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%2F5nhs9yloym8ki7coadg8.png" class="article-body-image-wrapper"&gt;&lt;img width="800" 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%2F5nhs9yloym8ki7coadg8.png" alt="AWS and Cloudflare logos above a spending curve crossing an illustrative $50 alert threshold. Spending continues upward; the caption reads: Well, that scaled." height="267"&gt;&lt;/a&gt;&lt;/p&gt;
An example threshold. A warning doesn’t cap spending.



&lt;p&gt;The warning won’t cap the bill. Appkeepr receives supported webhook alerts when the provider sends them, so the provider’s reporting delay still matters.&lt;/p&gt;

&lt;p&gt;Uptime and expiry checks are a little different: those are built into Appkeepr. I add a URL to check whether a site is reachable, or a domain for domain and certificate expiry reminders. I’d otherwise need separate tools for those checks, or have to remember to do them myself.&lt;/p&gt;

&lt;p&gt;I’d quite like renewing a domain to remain a boring job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leave some events off
&lt;/h2&gt;

&lt;p&gt;I’d soon regret sending every event to my phone. For a subscription app, I might enable notifications for purchases and payment problems, and leave trial starts off:&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%2Fp998llncxrl2mbtzxjzp.png" class="article-body-image-wrapper"&gt;&lt;img width="800" 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%2Fp998llncxrl2mbtzxjzp.png" alt="RevenueCat event selection in Appkeepr: new purchases and payment problems are on; trial starts, cancellations and expirations, and subscription changes are off." height="583"&gt;&lt;/a&gt;&lt;/p&gt;
An example selection in Appkeepr’s RevenueCat connection.



&lt;p&gt;The connection won’t send messages for the events I leave off. I can change that selection later. The trial numbers are still in RevenueCat when I want to look at them.&lt;/p&gt;

&lt;p&gt;That distinction matters to me. There are plenty of things worth measuring that I don’t need to hear about individually. I’d rather start with the few updates I already go looking for and add others if I miss them.&lt;/p&gt;

&lt;p&gt;A failed deploy and a converted trial, with the app and channel shown for each:&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%2Ffyenyk0bk5fmpguq1ajb.png" class="article-body-image-wrapper"&gt;&lt;img width="800" 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%2Ffyenyk0bk5fmpguq1ajb.png" alt="Appkeepr mobile Inbox demo showing a failed deployment in revos and a converted trial in nastea." height="620"&gt;&lt;/a&gt;&lt;/p&gt;
Example events in Appkeepr’s mobile Inbox.



&lt;p&gt;You can &lt;a href="https://appkeepr.com/#inbox" rel="noopener noreferrer"&gt;open the demo inbox&lt;/a&gt; and look around.&lt;/p&gt;

&lt;p&gt;I still need dashboards and logs when something needs investigating. I just want the phone to give me a reason to open them, instead of opening them to check whether anything happened.&lt;/p&gt;

&lt;p&gt;If you run more than one app, what do you keep checking manually?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
