<?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: Vigilmon</title>
    <description>The latest articles on DEV Community by Vigilmon (@vigilmon).</description>
    <link>https://dev.clauneck.workers.dev/vigilmon</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%2F3994004%2F5bbb781a-0339-47ba-a104-c3867a33ea60.png</url>
      <title>DEV Community: Vigilmon</title>
      <link>https://dev.clauneck.workers.dev/vigilmon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.clauneck.workers.dev/feed/vigilmon"/>
    <language>en</language>
    <item>
      <title>Stop Finding Out About Downtime from Users — Monitor Your Node.js App</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Tue, 23 Jun 2026 02:23:46 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/stop-finding-out-about-downtime-from-users-monitor-your-nodejs-app-49jf</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/stop-finding-out-about-downtime-from-users-monitor-your-nodejs-app-49jf</guid>
      <description>&lt;p&gt;There's a particular kind of dread that hits when a user DMs you "hey, is your app down?" You check the URL. Yep. Down. For how long? Who knows. When did it go down? Mystery.&lt;/p&gt;

&lt;p&gt;If you've been there, you know the feeling. And if you haven't — you will.&lt;/p&gt;

&lt;p&gt;Uptime monitoring means you get the alert, not your users. In this tutorial, I'll show you how to set up monitoring for your Node.js app in about 5 minutes using &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; — a free uptime monitoring service. We'll also wire up a webhook so you can pipe those alerts directly to Slack or Discord.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Vigilmon?
&lt;/h2&gt;

&lt;p&gt;Vigilmon is a lightweight uptime monitor that pings your endpoints every minute and alerts you when something goes wrong. It supports HTTP/HTTPS checks, TCP port checks, email and webhook alerts, and public status pages. The free tier gets you up to 10 monitors — enough to cover most side projects and small production apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Sign Up and Add Your Monitor
&lt;/h2&gt;

&lt;p&gt;Head to &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; and create a free account. Once you're in, click &lt;strong&gt;Add Monitor&lt;/strong&gt; and fill in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: Something memorable (e.g., "My Express API")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: Your app's health check endpoint (e.g., &lt;code&gt;https://api.myapp.com/health&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check interval&lt;/strong&gt;: 1 minute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don't have a dedicated health endpoint yet, add one — it's worth it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Express.js health check endpoint&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/health&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;uptime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uptime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vigilmon will ping this URL every minute and look for a 2xx response. If it gets anything else — or no response at all — it fires an alert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Set Up Email Alerts
&lt;/h2&gt;

&lt;p&gt;In your monitor settings, go to &lt;strong&gt;Alert Channels&lt;/strong&gt; and add your email address. That's it. Next time your app goes down, you'll get an email within 1-2 minutes.&lt;/p&gt;

&lt;p&gt;This is your bare minimum. But email has latency — you might miss an alert in a busy inbox. For production apps, you want something louder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add a Webhook for Slack/Discord Alerts
&lt;/h2&gt;

&lt;p&gt;Vigilmon can POST a JSON payload to any URL when your monitor status changes. Here's how to wire that up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Webhook Receiver in Node.js
&lt;/h3&gt;

&lt;p&gt;Here's a simple Express app that receives Vigilmon webhooks and forwards them to Slack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SLACK_WEBHOOK_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhooks/vigilmon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;monitor_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;checked_at&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emoji&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🔴&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;✅&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; *&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;monitor_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;* is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;\n URL: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n Detected: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;checked_at&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;slackUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;SLACK_WEBHOOK_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;slackUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;slackUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;slackUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Webhook receiver running on port 3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deploy this alongside your app (or as a standalone service) and grab the public URL. Then in Vigilmon, go to &lt;strong&gt;Alert Channels → Add Webhook&lt;/strong&gt; and paste in your endpoint: &lt;code&gt;https://yourdomain.com/webhooks/vigilmon&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Routing to Discord Instead
&lt;/h3&gt;

&lt;p&gt;Discord uses a slightly different webhook payload format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// For Discord, swap out the Slack payload&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;discordPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;emoji&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; **&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;monitor_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;** is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt; — &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same idea — point it at your Discord channel's incoming webhook URL and you'll get real-time pings in your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Share a Public Status Page
&lt;/h2&gt;

&lt;p&gt;One of the underrated features of Vigilmon is the public status page. Go to &lt;strong&gt;Status Pages&lt;/strong&gt; in the dashboard and create one that lists your monitors. You'll get a shareable URL like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://status.vigilmon.online/your-page-slug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this link to your app's footer, docs, or support email. When something breaks, customers can check status themselves before flooding your inbox with "is it just me?" questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Here's the honest truth: most outages last under 10 minutes for simple restarts or deploy errors. But without monitoring, those 10 minutes are invisible to you and visible to every user who hits a 503.&lt;/p&gt;

&lt;p&gt;With Vigilmon running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You know within about 1 minute when something goes down&lt;/li&gt;
&lt;li&gt;You have exact timestamps for incident reports and post-mortems&lt;/li&gt;
&lt;li&gt;Customers can check a status page instead of guessing&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Getting uptime monitoring set up for a Node.js app takes less than 5 minutes with Vigilmon — free account, one monitor, email alerts, and an optional webhook for Slack or Discord.&lt;/p&gt;

&lt;p&gt;Give it a try at &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; and drop a comment below with how you've set up alerting for your own apps. I'm especially curious what people are doing with webhooks in production.&lt;/p&gt;

</description>
      <category>node</category>
      <category>webdev</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>Free Uptime Monitoring for Your Node.js App with Vigilmon</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Tue, 23 Jun 2026 01:26:41 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/free-uptime-monitoring-for-your-nodejs-app-with-vigilmon-75m</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/free-uptime-monitoring-for-your-nodejs-app-with-vigilmon-75m</guid>
      <description>&lt;p&gt;Your Node.js cron job ran at 3am. Or did it? Your Express API is returning 500s to production users right now. Do you know?&lt;/p&gt;

&lt;p&gt;Most developers only find out their Node.js app went down when a user files a support ticket — hours after the fact. By then, you have lost trust, revenue, and a weekend.&lt;/p&gt;

&lt;p&gt;In this tutorial, you will set up &lt;strong&gt;free uptime monitoring&lt;/strong&gt; for your Node.js/Express app using &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; in under 10 minutes. We will cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP uptime checks for your Express API endpoints&lt;/li&gt;
&lt;li&gt;Heartbeat monitoring for Node.js cron jobs&lt;/li&gt;
&lt;li&gt;SSL certificate expiry alerts&lt;/li&gt;
&lt;li&gt;Slack and email notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No credit card required.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Problem: Silent Failures Kill Trust
&lt;/h2&gt;

&lt;p&gt;Node.js apps fail in two distinct ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loud failures&lt;/strong&gt; — your app crashes, PM2 restarts it, you get an error log. These are annoying but visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silent failures&lt;/strong&gt; — your cron job silently stops running. Your API returns 500s but never crashes. Your SSL cert expires and Chrome starts showing warnings. These are the killers.&lt;/p&gt;

&lt;p&gt;For Express APIs, a silent 500 means users see an error but your server is technically "up." For cron jobs — things like sending emails, syncing data, or processing queues — the job just stops. No crash, no log entry, no alert.&lt;/p&gt;

&lt;p&gt;You need external monitoring that checks from outside your infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What Vigilmon Monitors
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; offers three types of monitoring that directly address Node.js failure modes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Checks&lt;/strong&gt; — Vigilmon pings your API endpoints every minute and alerts you if they return non-2xx status codes or take too long to respond. Perfect for Express routes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heartbeat Monitoring&lt;/strong&gt; — Your cron job sends a "heartbeat" ping to Vigilmon after each successful run. If Vigilmon does not receive a ping within the expected window, it fires an alert. This catches silent cron failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSL Expiry&lt;/strong&gt; — Vigilmon warns you 30, 14, and 7 days before your SSL certificate expires. No more unexpected "connection not secure" warnings for your users.&lt;/p&gt;

&lt;p&gt;All of this is free on the free tier — no credit card needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Set Up HTTP Monitoring for Express
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Add a health check endpoint
&lt;/h3&gt;

&lt;p&gt;Add a &lt;code&gt;/health&lt;/code&gt; endpoint to your Express app. This gives Vigilmon a reliable endpoint that does not require auth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app.js&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/health&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to verify database connectivity too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/health&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT 1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disconnected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Create an HTTP monitor in Vigilmon
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; (free, no card)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Monitor → HTTP Check&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your endpoint URL: &lt;code&gt;https://yourdomain.com/health&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set the check interval (1 minute on the free tier)&lt;/li&gt;
&lt;li&gt;Set an alert threshold — e.g., alert if response time &amp;gt; 3000ms or status is not 2xx&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vigilmon will start pinging your endpoint immediately and alert you the moment it goes down.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Heartbeat Monitoring for Node.js Cron Jobs
&lt;/h2&gt;

&lt;p&gt;This is the killer feature for Node.js backends. Here is how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You create a heartbeat monitor in Vigilmon with an expected interval (e.g., every 5 minutes)&lt;/li&gt;
&lt;li&gt;At the end of each successful cron job run, your code sends a GET request to Vigilmon's ping URL&lt;/li&gt;
&lt;li&gt;If Vigilmon does not receive a ping within the expected interval plus a grace period, it fires an alert&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Setting it up with &lt;code&gt;node-cron&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;First, create the heartbeat monitor in Vigilmon:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Add Monitor → Heartbeat&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it (e.g., "Email digest job")&lt;/li&gt;
&lt;li&gt;Set the expected interval (e.g., 5 minutes)&lt;/li&gt;
&lt;li&gt;Copy the ping URL — it will look like &lt;code&gt;https://vigilmon.online/api/heartbeat/ping/abc123&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then wire it into your cron job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cron&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node-cron&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;https&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Store your ping URL in .env&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;VIGILMON_HEARTBEAT_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIGILMON_HEARTBEAT_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pingVigilmon&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;VIGILMON_HEARTBEAT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vigilmon ping failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*/5 * * * *&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your actual job logic&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processEmailQueue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;syncDataFromAPI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Only ping after successful completion&lt;/span&gt;
    &lt;span class="nf"&gt;pingVigilmon&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Job done, heartbeat sent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Job failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// No ping = Vigilmon alerts after the grace period&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key principle: &lt;strong&gt;only ping after successful completion&lt;/strong&gt;. If your job throws, skip the ping. Vigilmon will notice the missed heartbeat and fire an alert.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using axios instead
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pingVigilmon&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIGILMON_HEARTBEAT_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Vigilmon ping failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store the URL in &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;VIGILMON_HEARTBEAT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://vigilmon.online/api/heartbeat/ping/YOUR_ID_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Monitoring multiple cron jobs
&lt;/h3&gt;

&lt;p&gt;For multiple jobs, create a separate heartbeat monitor for each one — this gives you per-job failure visibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;monitors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;emailQueue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIGILMON_EMAIL_HEARTBEAT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;dataSync&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIGILMON_SYNC_HEARTBEAT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;reports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;VIGILMON_REPORTS_HEARTBEAT_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runEmailJob&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processEmails&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;monitors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emailQueue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runSyncJob&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;syncFromAPI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;monitors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSync&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Configure Slack and Email Alerts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Email alerts
&lt;/h3&gt;

&lt;p&gt;Vigilmon sends alerts to your account email by default. Add extra recipients under &lt;strong&gt;Settings → Notifications&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slack alerts
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings → Integrations → Slack&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Connect to Slack&lt;/strong&gt; and authorize the app&lt;/li&gt;
&lt;li&gt;Choose which channel receives alerts (e.g., &lt;code&gt;#incidents&lt;/code&gt; or &lt;code&gt;#ops&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When your Express API goes down or a cron job misses its heartbeat, you get a Slack message within the minute. The alert includes the monitor name, failure type, timestamp, and a direct link to investigate.&lt;/p&gt;

&lt;p&gt;When the issue resolves, Vigilmon sends a recovery notification automatically — no manual clear required.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Optional: Public Status Page
&lt;/h2&gt;

&lt;p&gt;If you want your users or team to see uptime history without logging into Vigilmon, you can publish a public status page in one click.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;Settings → Status Page&lt;/strong&gt;, toggle it on, and Vigilmon generates a public URL that shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current status of all your monitors&lt;/li&gt;
&lt;li&gt;Uptime percentage over the last 30 and 90 days&lt;/li&gt;
&lt;li&gt;Incident history&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero extra configuration needed — it reflects the monitors you have already set up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;Here is what you now have in place:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Express API returns 500s or goes offline&lt;/td&gt;
&lt;td&gt;HTTP monitor alerts within 1 minute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron job silently stops running&lt;/td&gt;
&lt;td&gt;Heartbeat monitor alerts after missed ping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL cert approaching expiry&lt;/td&gt;
&lt;td&gt;30/14/7-day advance warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alert fires&lt;/td&gt;
&lt;td&gt;Instant Slack message and email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Users want to check status&lt;/td&gt;
&lt;td&gt;Public status page URL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Free tier includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Up to 10 monitors&lt;/li&gt;
&lt;li&gt;1-minute check intervals&lt;/li&gt;
&lt;li&gt;Email and Slack notifications&lt;/li&gt;
&lt;li&gt;Public status page&lt;/li&gt;
&lt;li&gt;No credit card required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get started at &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; — it takes less time to set up than it took to read this article.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Also worth reading: &lt;a href="https://dev.clauneck.workers.dev/vigilmon/monitor-your-laravel-app-with-vigilmon-2flk"&gt;Monitor your Laravel app with Vigilmon&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <item>
      <title>5 Signs Your Uptime Monitoring is Failing You (and What to Do About It)</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Tue, 23 Jun 2026 01:10:16 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/5-signs-your-uptime-monitoring-is-failing-you-and-what-to-do-about-it-43em</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/5-signs-your-uptime-monitoring-is-failing-you-and-what-to-do-about-it-43em</guid>
      <description>&lt;p&gt;Uptime monitoring is supposed to give you peace of mind. Set it up, forget about it, and sleep soundly knowing you'll be the first to know when something breaks.&lt;/p&gt;

&lt;p&gt;But a lot of teams are running monitors that give them a false sense of security. The tool says "all systems operational" — until a customer emails to ask why your site has been down for 20 minutes.&lt;/p&gt;

&lt;p&gt;Here are five signs your uptime monitoring is quietly failing you.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. You Get Alerts at 3am for Outages That Never Happened
&lt;/h2&gt;

&lt;p&gt;False positives are the silent killer of on-call rotations. You get paged in the middle of the night, scramble to investigate, and discover... everything is fine. The monitor fired, but there was no real outage.&lt;/p&gt;

&lt;p&gt;This usually happens because your monitoring tool is checking from a single probe. That probe had a momentary network blip — a packet drop, a DNS hiccup — and declared your site dead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Use a monitor that requires consensus across multiple independent probes before firing an alert. If 4 out of 5 probes can't reach your site, that's a real outage. If only 1 out of 5 fails, it's network noise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; uses a 5-probe consensus model: an alert only fires when a majority of geographically distributed probes independently confirm the failure. This eliminates nearly all false positives without delaying detection of real incidents.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Your Monitor Only Checks from One Location
&lt;/h2&gt;

&lt;p&gt;A single-region monitor can't tell you whether your site is down &lt;em&gt;for everyone&lt;/em&gt; or just &lt;em&gt;unreachable from one region&lt;/em&gt;. It also can't detect CDN failures, regional DNS issues, or geographic routing problems that affect only some of your users.&lt;/p&gt;

&lt;p&gt;Here's a simple example of what a good monitor config should look like:&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;monitor&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="s"&gt;https://yourapp.com/health&lt;/span&gt;
  &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;          &lt;span class="c1"&gt;# check every 60 seconds&lt;/span&gt;
  &lt;span class="na"&gt;regions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;us-east&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;eu-west&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ap-southeast&lt;/span&gt;
  &lt;span class="na"&gt;consensus_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;  &lt;span class="c1"&gt;# alert only if 3+ regions fail&lt;/span&gt;
  &lt;span class="na"&gt;timeout_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your current tool doesn't have something like &lt;code&gt;regions&lt;/code&gt; in its config, you're flying blind for a portion of your users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Choose a monitoring tool that checks from multiple geographic regions and only alerts when failures are confirmed across regions — not just from a single vantage point.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. You Find Out About Downtime from Customers, Not Your Monitor
&lt;/h2&gt;

&lt;p&gt;This is the most embarrassing sign. A customer Slacks you "hey, is your site down?" and you check your monitoring dashboard — green across the board.&lt;/p&gt;

&lt;p&gt;This usually means one of two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your monitor is checking the wrong endpoint (e.g., a static homepage instead of the actual app)&lt;/li&gt;
&lt;li&gt;Your monitor's check interval is too long (checking every 5 or 10 minutes means users can experience nearly 10 minutes of downtime before you're even notified)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Monitor the real health of your application — not just the marketing page. Set up a dedicated &lt;code&gt;/health&lt;/code&gt; endpoint that exercises your database connection, cache, and any critical dependencies. Then check it frequently — every 30–60 seconds at minimum.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Laravel example: routes/web.php&lt;/span&gt;
&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/health'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getPdo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// will throw if DB is down&lt;/span&gt;
    &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'health_check'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ok'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're on Laravel, check out our earlier guide: &lt;a href="https://dev.clauneck.workers.dev/vigilmon/monitor-your-laravel-app-with-vigilmon-2flk"&gt;Monitor your Laravel app with Vigilmon&lt;/a&gt; for a step-by-step setup including health endpoints and webhook alerts.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Your SSL Certificate Expired Without Warning
&lt;/h2&gt;

&lt;p&gt;SSL expiry is 100% predictable — the expiry date is baked into the certificate. Yet it catches teams off guard constantly. The reason: most uptime monitors only check whether your site responds with HTTP 200. They don't inspect the certificate.&lt;/p&gt;

&lt;p&gt;When your SSL cert expires, browsers show a "Your connection is not private" error to every visitor. Your site might technically be "up" according to your monitor, but no one can use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Use a monitoring tool that actively inspects SSL certificates and alerts you with enough lead time to renew — ideally 30 days before expiry, with reminders at 14 and 7 days.&lt;/p&gt;

&lt;p&gt;Vigilmon's SSL monitoring tracks your certificate expiry date continuously and sends alerts at configurable thresholds. No more scrambling at midnight to renew a cert that expired hours ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. You Have No Public Status Page to Communicate with Users
&lt;/h2&gt;

&lt;p&gt;Even the best monitoring setup can't prevent every outage. What separates good engineering teams from great ones is how they communicate during incidents.&lt;/p&gt;

&lt;p&gt;Without a public status page, every outage turns into a support ticket storm. Users don't know whether to wait, switch tools, or escalate internally. Your support team spends the incident manually responding to "is this down for everyone?" messages.&lt;/p&gt;

&lt;p&gt;A public status page gives users one place to check. It reduces inbound support volume, builds trust by showing you're aware of the issue, and creates a historical record of your reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to do:&lt;/strong&gt; Set up a status page and link to it from your app's error pages, your README, and your support docs. Make it the default answer to "is something wrong?"&lt;/p&gt;

&lt;p&gt;Vigilmon includes a built-in public status page at no extra cost. It automatically reflects the real-time state of your monitors, so you don't need to manually update it during incidents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting It Together
&lt;/h2&gt;

&lt;p&gt;Good uptime monitoring isn't just about knowing when your site is down — it's about knowing &lt;em&gt;accurately&lt;/em&gt;, &lt;em&gt;quickly&lt;/em&gt;, and &lt;em&gt;with enough context&lt;/em&gt; to act. It means catching problems before your customers do, getting paged only when something real is broken, and being able to communicate clearly when things go wrong.&lt;/p&gt;

&lt;p&gt;If any of the five signs above sound familiar, it's worth auditing your current setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you checking from multiple regions with consensus-based alerting?&lt;/li&gt;
&lt;li&gt;Is your health endpoint exercising real application dependencies?&lt;/li&gt;
&lt;li&gt;Are you monitoring SSL expiry, not just HTTP status?&lt;/li&gt;
&lt;li&gt;Do your users have somewhere to go during an incident?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're starting fresh or switching tools, &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Try Vigilmon free at vigilmon.online&lt;/a&gt; — no credit card required. It covers all five of these gaps out of the box, and you can have monitors running in under five minutes.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>devops</category>
      <category>webdev</category>
      <category>uptime</category>
    </item>
    <item>
      <title>Create a Public Status Page in 5 Minutes with Vigilmon</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Mon, 22 Jun 2026 21:12:03 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/create-a-public-status-page-in-5-minutes-with-vigilmon-1p1h</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/create-a-public-status-page-in-5-minutes-with-vigilmon-1p1h</guid>
      <description>&lt;p&gt;Your app goes down at 2am. Support tickets flood in. Users tweet angry things. But the worst part? Every single person had to check for themselves — no one knew what was happening.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;A public status page changes all of that. It gives your users one place to check, saves your support team from repeating the same "we're investigating" message over and over, and signals that you take reliability seriously.&lt;/p&gt;

&lt;p&gt;The good news: if you're already using Vigilmon for uptime monitoring, you're one click away from a live status page. No extra config, no third-party tools, no monthly bill for a separate service.&lt;/p&gt;

&lt;p&gt;Here's how to set it up in under 5 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why a Status Page Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;Before we dive in, let's talk about why this is worth 5 minutes of your time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust is built in the quiet moments.&lt;/strong&gt; When your app is running fine, users don't think about uptime. But when it goes down, how you handle communication defines your reputation. A status page says: &lt;em&gt;we're transparent, we know what's happening, and we're on it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It cuts support volume dramatically.&lt;/strong&gt; "Is the site down?" is one of the most common support questions for any SaaS product. A public status page lets users answer that question themselves — without emailing you, posting on Twitter, or assuming the worst.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's table stakes for B2B.&lt;/strong&gt; If you're selling to businesses, they'll ask whether you have a status page. It's part of their vendor evaluation checklist. Not having one raises red flags.&lt;/p&gt;

&lt;p&gt;The tricky part used to be that running a status page meant either paying for a dedicated tool (Statuspage.io, Instatus, etc.) or building something custom. With Vigilmon, it's just part of the monitoring you're already doing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A Vigilmon account (free tier works — includes 5 monitors and unlimited status pages)&lt;/li&gt;
&lt;li&gt;Your app's URL&lt;/li&gt;
&lt;li&gt;About 5 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Let's go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Sign Up for Vigilmon
&lt;/h2&gt;

&lt;p&gt;Head to &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; and create a free account. The free tier gives you 5 monitors, 3-minute check intervals, and full access to status pages — no credit card required.&lt;/p&gt;

&lt;p&gt;If you already have an account, skip ahead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Add a Monitor for Your App
&lt;/h2&gt;

&lt;p&gt;Before you can show uptime on a status page, you need at least one monitor running.&lt;/p&gt;

&lt;p&gt;Go to your dashboard and click &lt;strong&gt;Add Monitor&lt;/strong&gt;. Fill in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Type:&lt;/strong&gt; HTTP(S) — for a URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; Your app's public URL (e.g. &lt;code&gt;https://yourapp.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; Something your users will recognize, like "App" or "API"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check interval:&lt;/strong&gt; Every 1–3 minutes on free tier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt;. Vigilmon starts checking your URL immediately. Within a minute or two, you'll see your first status data.&lt;/p&gt;

&lt;p&gt;If you have multiple services — an API, a web frontend, a docs site — add a monitor for each. Your status page can show all of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Create Your Status Page
&lt;/h2&gt;

&lt;p&gt;In the sidebar, click &lt;strong&gt;Status Pages&lt;/strong&gt;, then &lt;strong&gt;Create Page&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll see a simple form:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Page Name&lt;/strong&gt; — This is the internal name for your reference (e.g. "Main Status Page").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slug&lt;/strong&gt; — This becomes the public URL. Something like &lt;code&gt;status&lt;/code&gt; gives you a clean, shareable link. Keep it short.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which monitors to show&lt;/strong&gt; — Pick the monitors you want displayed publicly. You can show all of them, or be selective. For example, you might show your web frontend and API, but not your internal admin panel.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt;. Your status page is live immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Customize Your Page
&lt;/h2&gt;

&lt;p&gt;Once created, you can edit a few things to make it feel like yours:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Page title and description&lt;/strong&gt; — Set a heading like "YourApp System Status" and a short description like "Live uptime for all YourApp services."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom domain&lt;/strong&gt; — If you want &lt;code&gt;status.yourapp.com&lt;/code&gt; instead of the Vigilmon-hosted URL, add a CNAME record pointing to Vigilmon's servers. The settings page walks you through it. This takes 5–10 minutes for DNS to propagate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident history&lt;/strong&gt; — Status pages automatically show recent incidents pulled from your monitor downtime history. Users can see what happened and when — no manual updates required.&lt;/p&gt;

&lt;p&gt;That's the whole setup. Your page is public and live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Tell People About It
&lt;/h2&gt;

&lt;p&gt;The status page only helps if people know it exists. A few quick wins:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add it to your footer.&lt;/strong&gt; Most apps have a footer with links like "Privacy", "Terms", "Docs". Add "Status" alongside those. It takes 2 minutes and covers the most common discovery path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link it from your error pages.&lt;/strong&gt; If your app has a 500 or 503 page, add a link to your status page. Users hitting an error page are exactly the audience who need it most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put it in your onboarding email.&lt;/strong&gt; When new users sign up, drop the status page URL into your welcome email or docs. "Check &lt;a href="https://status.yourapp.com" rel="noopener noreferrer"&gt;status.yourapp.com&lt;/a&gt; for live service status."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mention it in support responses.&lt;/strong&gt; Next time a user emails about an outage, link them to the status page. They'll bookmark it for next time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Embed the Status Badge
&lt;/h2&gt;

&lt;p&gt;If you want real-time status visible on your own website — without sending users to a separate page — Vigilmon provides an embeddable status badge.&lt;/p&gt;

&lt;p&gt;Go to your status page settings and grab the badge embed code. It looks something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://status.yourapp.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://vigilmon.online/badge/your-page-slug.svg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"System Status"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop this into your site's header, footer, or landing page. It shows a live green/yellow/red indicator that updates automatically. No JavaScript required — it's just an SVG.&lt;/p&gt;

&lt;p&gt;This is especially useful on landing pages and pricing pages where trust signals matter most.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why We Built This Into Vigilmon
&lt;/h2&gt;

&lt;p&gt;When we first built Vigilmon, we thought of monitoring as a developer tool — something for the team running the infrastructure. You add the monitors, you get the alerts, done.&lt;/p&gt;

&lt;p&gt;But then we started hearing from users: &lt;em&gt;"Our customers are asking if we have a status page. What do you recommend?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We kept pointing people to third-party tools, but it felt wrong. The whole point of Vigilmon is that you shouldn't need a patchwork of services to manage your app's reliability. The monitoring data we already collect is exactly what a status page needs. So we built it in.&lt;/p&gt;

&lt;p&gt;Now when your app goes down at 2am, your team knows immediately through alerts — and your customers can check the status page instead of emailing support. Everyone gets what they need.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Once your status page is up, a few things to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Add monitors for all public-facing services&lt;/strong&gt; — API, CDN, docs, auth service. Anything a customer might interact with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up email alerts&lt;/strong&gt; — Get notified the moment something goes down. &lt;a href="https://dev.clauneck.workers.dev/vigilmon/monitor-your-laravel-app-with-vigilmon-2flk"&gt;We covered that in detail in our Laravel monitoring tutorial&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check your SSL expiry&lt;/strong&gt; — Vigilmon monitors SSL certificates too. An expired cert looks just like downtime to your customers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vigilmon's free tier includes 5 monitors, which covers most early-stage SaaS products. If you need more, paid plans start at $7/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ Get started at &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;That's the whole thing. A public status page in 5 minutes, with no extra tools, no separate subscription, and no manual updates during outages.&lt;/p&gt;

&lt;p&gt;If you found this useful, share it with someone who's still saying "we don't have a status page yet." That time is up.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>monitoring</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Eliminate False Alert Fatigue in Your Uptime Monitoring Setup</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Mon, 22 Jun 2026 18:36:35 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/how-to-eliminate-false-alert-fatigue-in-your-uptime-monitoring-setup-2pad</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/how-to-eliminate-false-alert-fatigue-in-your-uptime-monitoring-setup-2pad</guid>
      <description>&lt;p&gt;It's 3:47 AM. Your phone screams. Your site is down.&lt;/p&gt;

&lt;p&gt;You stumble to your laptop, open your monitoring dashboard... and everything is green. False alarm. Again.&lt;/p&gt;

&lt;p&gt;If you've been running production services for any length of time, you know this pain. False positives from uptime monitors don't just wake you up for no reason — they erode your trust in the monitoring system itself. Eventually, you start ignoring alerts. And that's when the real outages slip through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Traditional Uptime Monitors Lie to You
&lt;/h2&gt;

&lt;p&gt;Most uptime monitors work like this: a single server in a single location pings your site every 60 seconds. If it doesn't get a response, it fires an alert.&lt;/p&gt;

&lt;p&gt;The problem? That single probe server might be experiencing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transient network issues&lt;/strong&gt; (packet loss between the probe and your server)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BGP routing hiccups&lt;/strong&gt; affecting one ISP or region&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS propagation delays&lt;/strong&gt; in a specific geographic area&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your site is perfectly healthy. Your users are unaffected. But your pager is going off at 4 AM.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Multi-Region Consensus Checking
&lt;/h2&gt;

&lt;p&gt;The solution to false positives is simple in principle: &lt;strong&gt;don't trust a single data point&lt;/strong&gt;. Instead, check from multiple geographic locations simultaneously. Only alert when the majority of probes agree there's actually a problem.&lt;/p&gt;

&lt;p&gt;This is what &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; does. Before it fires an alert, it verifies the outage from multiple independent regions. If one probe sees a failure but others don't, it marks it as a transient blip — not an outage — and stays quiet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Vigilmon in 2 Minutes
&lt;/h2&gt;

&lt;p&gt;Here's how to add your first monitor — &lt;strong&gt;no credit card required, free for up to 5 monitors&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create your account
&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; and sign up. The free tier gives you &lt;strong&gt;5 monitors&lt;/strong&gt; with no credit card required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Add your first monitor
&lt;/h3&gt;

&lt;p&gt;In the dashboard, click &lt;strong&gt;New Monitor&lt;/strong&gt; and enter your URL. You can configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check interval&lt;/strong&gt;: how often to ping (default: 60 seconds)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert threshold&lt;/strong&gt;: how many regions must agree before an alert fires&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification channels&lt;/strong&gt;: email, webhooks, or Slack&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Configure notification channels
&lt;/h3&gt;

&lt;p&gt;Set up your preferred alerting channels. Vigilmon supports email notifications out of the box, with webhook support for integrating with PagerDuty, Slack, or any custom system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Trust your alerts again
&lt;/h3&gt;

&lt;p&gt;Once you're monitoring with multi-region consensus, when an alert fires — it means there's actually an issue. Not a network hiccup between Frankfurt and your server. An actual outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll See in the Dashboard
&lt;/h2&gt;

&lt;p&gt;Vigilmon's response time history view shows you latency trends over time, color-coded so outliers stand out at a glance. You can quickly distinguish between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Healthy&lt;/strong&gt; — fast, consistent response times&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Degraded&lt;/strong&gt; — elevated latency, might need attention&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Down&lt;/strong&gt; — confirmed outage from multiple regions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 7-day and 30-day views make it easy to spot patterns: is there a specific time of day when your CDN slows down? Are response times gradually creeping up?&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking the False Alert Spiral
&lt;/h2&gt;

&lt;p&gt;The compounding damage of false alerts is real: teams that get too many false positives start treating their monitoring as noise. They mute alerts, delay responses, and eventually lose visibility into actual incidents.&lt;/p&gt;

&lt;p&gt;The fix isn't to ignore alerts more aggressively — it's to make your alerts worth trusting again.&lt;/p&gt;

&lt;p&gt;Multi-region consensus monitoring means that when Vigilmon wakes you up, something is genuinely wrong. That's the only way to maintain alert hygiene over the long run.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to stop getting paged for non-issues?&lt;/strong&gt; Set up your first monitor in 2 minutes at &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; — &lt;strong&gt;free for up to 5 monitors&lt;/strong&gt;, no credit card required.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>devops</category>
      <category>webdev</category>
      <category>sre</category>
    </item>
    <item>
      <title>We Shipped 36 Features in 30 Days — Here's What We Built (and Learned)</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Sat, 20 Jun 2026 13:46:58 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/we-shipped-36-features-in-30-days-heres-what-we-built-and-learned-4pme</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/we-shipped-36-features-in-30-days-heres-what-we-built-and-learned-4pme</guid>
      <description>&lt;p&gt;On May 18 we launched &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; — an uptime and website monitoring service for developers and indie makers who want to know when their sites go down before their users do. Since then, we've been heads-down building in public.&lt;/p&gt;

&lt;p&gt;Here's every feature we shipped in the first 30 days.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Core Monitoring
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Response time tracking&lt;/strong&gt; — Every check now records and displays response time so you can catch performance degradation before it becomes an outage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Incident history log&lt;/strong&gt; — A full incident log with start/end timestamps and duration. See exactly when things broke and when they recovered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. SSL certificate expiry alerts&lt;/strong&gt; — Vigilmon displays your cert's expiry date on the dashboard and status page and alerts you before it lapses. No more surprise cert failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Heartbeat / cron-job monitoring&lt;/strong&gt; — If your cron job doesn't ping us on schedule, we alert you. No more silent cron failures destroying your data pipeline at 3 AM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. TCP/port monitoring&lt;/strong&gt; — Monitor raw TCP connectivity on any port, not just HTTP. Useful for databases, mail servers, Redis, game servers — anything that listens on a port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Response content checks&lt;/strong&gt; — Configure a keyword that must appear in the response body. Case-insensitive matching. If your "Checkout" button disappears from your homepage, you'll know immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Configurable check intervals&lt;/strong&gt; — Choose 1, 5, 15, 30, or 60 minute intervals per monitor depending on how critical the endpoint is. High-traffic APIs get 1-minute checks; staging environments get hourly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. 90-day uptime chart&lt;/strong&gt; — Public status pages now show a rolling 90-day uptime bar chart. Cached for performance, looks great on your status page.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔔 Alerting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;9. Slack (Block Kit format)&lt;/strong&gt; — Upgraded Slack notifications to Block Kit with color sidebars — red for down, green for recovery. Actionable context instead of raw JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Webhook notifications&lt;/strong&gt; — Send alert payloads to any HTTPS endpoint. Build your own integrations: PagerDuty, OpsGenie, your custom incident bot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Discord alerts&lt;/strong&gt; — A native Discord webhook channel. Alerts land directly in your &lt;code&gt;#ops&lt;/code&gt; channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Telegram bot&lt;/strong&gt; — Telegram bot notifications. Send alerts to yourself or a group chat. Popular with our European users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. Email alert improvements&lt;/strong&gt; — Alert subjects now include the monitor name and status. Each email links directly to the incident on your dashboard — one click to the context you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Alert escalation rules&lt;/strong&gt; — If a monitor is still down after N minutes, escalate to a secondary contact. No more "was anyone notified?" post-mortems after an incident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15. Webhook delivery history&lt;/strong&gt; — Every webhook attempt is logged with status code, response body, and duration. You can debug a failed delivery without any guesswork.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;16. Maintenance windows&lt;/strong&gt; — Schedule planned downtime windows so alerts don't fire while you're deploying. No more 2 AM false alarms during your release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;17. Monthly uptime report emails&lt;/strong&gt; — Automated monthly summary with uptime % per monitor. Forward to your manager or include in your SLA report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18. Welcome email&lt;/strong&gt; — New users get a proper onboarding email with their first steps instead of landing in an empty app.&lt;/p&gt;

&lt;h2&gt;
  
  
  🖥️ Dashboard UX
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;19. Dashboard redesign&lt;/strong&gt; — Summary stats (monitors up/down, incidents today), a monitor grid with at-a-glance status indicators, and a live incident feed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;20. Monitor tags&lt;/strong&gt; — Tag monitors by project, environment, or team (&lt;code&gt;production&lt;/code&gt;, &lt;code&gt;staging&lt;/code&gt;, &lt;code&gt;api&lt;/code&gt;, &lt;code&gt;frontend&lt;/code&gt;). Filter by tag on the dashboard. Scales when you have 50+ monitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;21. Improved onboarding&lt;/strong&gt; — First-time users now see a guided empty-state instead of a blank dashboard. We cut time-to-first-monitor by 60%.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Developer Tools
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;22. Personal API tokens&lt;/strong&gt; — Generate API tokens (prefixed &lt;code&gt;vtk_&lt;/code&gt;) from account settings and manage monitors programmatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;23. REST API&lt;/strong&gt; — Full &lt;code&gt;/api/v1/monitors&lt;/code&gt; REST API — CRUD, status checks, incidents. Documented at &lt;a href="https://vigilmon.online/docs/api" rel="noopener noreferrer"&gt;vigilmon.online/docs/api&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;24. Custom HTTP request headers&lt;/strong&gt; — Specify request headers per monitor. Useful for bearer tokens, &lt;code&gt;X-Api-Key&lt;/code&gt; headers, or bypassing WAF rules on your staging environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;25. SVG status badges&lt;/strong&gt; — Embed a live status badge into your README or documentation. Updates in real-time. One line of Markdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;26. API documentation page&lt;/strong&gt; — A dedicated &lt;code&gt;/docs/api&lt;/code&gt; reference with endpoint tables, example requests, and token instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  📈 Marketing &amp;amp; SEO
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;27. Comparison pages&lt;/strong&gt; — &lt;code&gt;/compare/vigilmon-vs-pingdom&lt;/code&gt;, &lt;code&gt;/compare/vigilmon-vs-uptimerobot&lt;/code&gt;, and more. Targeting the "alternative to X" search queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;28. Technical SEO&lt;/strong&gt; — Sitemap, robots.txt, canonical tags, meta descriptions across all public pages, and structured data for rich snippets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;29. Dev.to tutorial articles&lt;/strong&gt; — Published tutorials on monitoring Laravel, Node.js, and Next.js apps with Vigilmon. These drive organic discovery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;30. Directory submissions&lt;/strong&gt; — Listed on BetaList, Product Hunt upcoming, and several developer tool directories.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we learned about prioritization
&lt;/h2&gt;

&lt;p&gt;After 30 days and 36+ shipped features, three lessons stick:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Monitoring features compound
&lt;/h3&gt;

&lt;p&gt;Each new check type (TCP, heartbeat, content checks) multiplies the number of things users can monitor. We should have shipped these earlier instead of polishing the dashboard first. The breadth of coverage is what makes a monitoring tool worth paying for.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Alerting IS the product
&lt;/h3&gt;

&lt;p&gt;Users don't open dashboards when things are fine. They care about: Was I notified? How fast? Was the notification actionable? Investing in webhook delivery history, escalation rules, and channel diversity had higher impact than we expected. The dashboard is a nice-to-have; the alert is the whole point.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Docs unlock API adoption
&lt;/h3&gt;

&lt;p&gt;We shipped the REST API and got zero integrations. We shipped the docs page and got three integrations in a week. Documentation is a feature, not a follow-up task.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Show HN launch&lt;/strong&gt; — We're preparing our Hacker News post. Watch this space or follow along on Dev.to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe payments&lt;/strong&gt; — Paid plans are nearly ready. The free tier (3 monitors, 5-minute checks) will always exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken link detection&lt;/strong&gt; — Crawl your site, find dead links before Google does, get a digest report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status page customization&lt;/strong&gt; — Custom domain support and branding for your public status page.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try Vigilmon
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; — free tier, no credit card required. Add your first monitor in under 60 seconds.&lt;/p&gt;

&lt;p&gt;If you're also building in public, drop a comment with your project — I'd love to follow along.&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>monitoring</category>
      <category>webdev</category>
      <category>indiehackers</category>
    </item>
    <item>
      <title>Monitor Your Laravel App with Vigilmon</title>
      <dc:creator>Vigilmon</dc:creator>
      <pubDate>Sat, 20 Jun 2026 11:29:52 +0000</pubDate>
      <link>https://dev.clauneck.workers.dev/vigilmon/monitor-your-laravel-app-with-vigilmon-2flk</link>
      <guid>https://dev.clauneck.workers.dev/vigilmon/monitor-your-laravel-app-with-vigilmon-2flk</guid>
      <description>&lt;p&gt;Your app is down. Your users can't reach it. You find out two hours later — not from a monitoring alert, but from an email that starts with "Hey, is your site broken?"&lt;/p&gt;

&lt;p&gt;Sound familiar? Uptime monitoring isn't optional for production apps — it's the difference between catching an outage in seconds and discovering it from a frustrated user. Whether you're running a solo side project or a startup, you need to know the moment something goes wrong.&lt;/p&gt;

&lt;p&gt;This tutorial walks you through setting up full uptime monitoring for a Laravel app using &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Vigilmon&lt;/a&gt; — a monitoring tool we built, ironically, with Laravel itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Vigilmon Offers (Free Tier)
&lt;/h2&gt;

&lt;p&gt;Before we dive in, here's what you get on the free plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/HTTPS uptime checks&lt;/strong&gt; — monitor any URL on intervals as short as 1 minute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSL certificate expiry monitoring&lt;/strong&gt; — get alerted before your cert expires and breaks HTTPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeat monitoring&lt;/strong&gt; — verify that your Laravel scheduler (or any cron job) is running on time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack, Discord, and email alerts&lt;/strong&gt; — instant notifications when something goes down&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public status pages&lt;/strong&gt; — share a live status URL with your users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;REST API&lt;/strong&gt; — create and manage monitors programmatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No credit card required. Let's get started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Sign Up at vigilmon.online
&lt;/h2&gt;

&lt;p&gt;Head to &lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;vigilmon.online&lt;/a&gt; and create a free account. The sign-up takes under a minute — just email and password, no billing details needed.&lt;/p&gt;

&lt;p&gt;Once you're in, you'll land on your dashboard. It's empty for now, but that won't last long.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Add Your First HTTP Monitor
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;"Add Monitor"&lt;/strong&gt; and select &lt;strong&gt;HTTP/HTTPS&lt;/strong&gt;. Fill in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: something descriptive, like &lt;code&gt;My App – Homepage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: your app's URL, e.g. &lt;code&gt;https://myapp.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check interval&lt;/strong&gt;: every 1 or 5 minutes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected status code&lt;/strong&gt;: &lt;code&gt;200&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Laravel apps with a health check endpoint, use that instead of the homepage — it's a lighter-weight check and more reliable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;URL: https://myapp.com/health
Expected content: "ok"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't have a &lt;code&gt;/health&lt;/code&gt; route yet, add one quickly in &lt;code&gt;routes/web.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/health'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ok'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vigilmon can assert on the response body too — so returning &lt;code&gt;{"status":"ok"}&lt;/code&gt; lets you configure an expected content match of &lt;code&gt;"ok"&lt;/code&gt;. If a deploy breaks your app and the health endpoint returns a 500 or an error page, you'll know within minutes.&lt;/p&gt;

&lt;p&gt;Hit &lt;strong&gt;Save&lt;/strong&gt;, and Vigilmon starts checking immediately. Your first monitor is live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Add a Heartbeat Monitor for Your Laravel Scheduler
&lt;/h2&gt;

&lt;p&gt;HTTP monitors tell you if your web server is responding. But they won't tell you if your Laravel scheduler has silently stopped running — which is exactly the kind of failure that slips through.&lt;/p&gt;

&lt;p&gt;Heartbeat monitoring solves this: Vigilmon gives you a unique URL to ping after each scheduler run. If it doesn't receive a ping within the expected window, it fires an alert.&lt;/p&gt;

&lt;p&gt;In your Vigilmon dashboard, click &lt;strong&gt;"Add Monitor"&lt;/strong&gt; → &lt;strong&gt;Heartbeat&lt;/strong&gt;. Configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;Laravel Scheduler&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected interval&lt;/strong&gt;: every 1 minute (or whatever your scheduler runs at)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grace period&lt;/strong&gt;: 2–3 minutes (time allowed before declaring it missed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vigilmon generates a heartbeat URL like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://vigilmon.online/heartbeat/abc123xyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now wire that into your Laravel scheduler. The cleanest approach is a dedicated Artisan command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Console\Commands&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Console\Command&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Http&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PingVigilmonHeartbeat&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Command&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'vigilmon:heartbeat'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="nv"&gt;$description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Ping Vigilmon heartbeat to confirm scheduler is running'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'services.vigilmon.heartbeat_url'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the URL to your &lt;code&gt;config/services.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'vigilmon'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'heartbeat_url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'VIGILMON_HEARTBEAT_URL'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in your &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;VIGILMON_HEARTBEAT_URL&lt;/span&gt;=&lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;vigilmon&lt;/span&gt;.&lt;span class="n"&gt;online&lt;/span&gt;/&lt;span class="n"&gt;heartbeat&lt;/span&gt;/&lt;span class="n"&gt;abc123xyz&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, register it in &lt;code&gt;routes/console.php&lt;/code&gt; (Laravel 11+) to run every minute, after your other scheduled jobs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Schedule&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Schedule&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'vigilmon:heartbeat'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;everyMinute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or in &lt;code&gt;app/Console/Kernel.php&lt;/code&gt; for older Laravel versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Schedule&lt;/span&gt; &lt;span class="nv"&gt;$schedule&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ... your other scheduled tasks ...&lt;/span&gt;
    &lt;span class="nv"&gt;$schedule&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'vigilmon:heartbeat'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;everyMinute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now every time &lt;code&gt;php artisan schedule:run&lt;/code&gt; fires and completes, Vigilmon gets a ping. If your scheduler stops — because of a server issue, a misconfigured cron job, or a deploy that never restarted the container — Vigilmon will notice within 2–3 minutes and alert you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Set Up Slack and Email Notifications
&lt;/h2&gt;

&lt;p&gt;In your Vigilmon dashboard, go to &lt;strong&gt;Settings → Notifications&lt;/strong&gt;. You can configure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email alerts&lt;/strong&gt;: your email is already set from sign-up. You'll get a message the moment a monitor goes down and another when it recovers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack&lt;/strong&gt;: paste your Slack webhook URL. Vigilmon posts to your chosen channel immediately on state change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discord&lt;/strong&gt;: same flow — paste your Discord webhook URL under the Discord integration.&lt;/p&gt;

&lt;p&gt;You can attach notification channels per-monitor, so you can route your scheduler heartbeat to &lt;code&gt;#ops&lt;/code&gt; and your public homepage monitor to &lt;code&gt;#alerts&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Share Your Status Page with Users
&lt;/h2&gt;

&lt;p&gt;Every Vigilmon account gets a public status page. Go to &lt;strong&gt;Status Page&lt;/strong&gt; in the dashboard, choose which monitors to display publicly, and enable it.&lt;/p&gt;

&lt;p&gt;You'll get a URL like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://status.vigilmon.online/yourapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Share this with your users — add a link in your app footer, your support docs, or your README. When your app is down, users can check the status page themselves instead of flooding your inbox with "is it down?" emails.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: Create Monitors via the REST API
&lt;/h2&gt;

&lt;p&gt;If you want to automate monitor creation as part of your deploy pipeline, Vigilmon has a REST API. Here's how to create an HTTP monitor with curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://vigilmon.online/api/v1/monitors &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "name": "My App – API",
    "type": "http",
    "url": "https://myapp.com/api/health",
    "interval": 60,
    "expectedStatusCode": 200,
    "expectedContent": "ok"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your API token lives under &lt;strong&gt;Settings → API&lt;/strong&gt;. This is handy for staging environments — create a monitor when a preview deploy spins up, delete it when the PR is merged.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why We Built Vigilmon
&lt;/h2&gt;

&lt;p&gt;We built Vigilmon because we kept running into the same problem with our own Laravel projects: monitoring was either expensive (services charging $30+/month for basic uptime checks) or painful to set up (self-hosted solutions that need their own infrastructure to keep running).&lt;/p&gt;

&lt;p&gt;Since we were already deep in the Laravel ecosystem, we built what we actually wanted — something simple, fast to set up, with a free tier that's genuinely useful for real projects. Vigilmon itself runs on Laravel and MySQL, deployed on a bare Linux VPS. We monitor it with itself.&lt;/p&gt;

&lt;p&gt;If you build things with Laravel, we built this for you. &lt;strong&gt;&lt;a href="https://vigilmon.online" rel="noopener noreferrer"&gt;Sign up free at vigilmon.online&lt;/a&gt;&lt;/strong&gt; — no credit card, no 14-day trial cliff. Just monitoring that works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions or feedback? Drop us a note at &lt;a href="mailto:hello@vigilmon.online"&gt;hello@vigilmon.online&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
