Tired of being blind to the availability of my websites and services, I created a really basic setup allowing me to be alerted in less than an hour if any of my apps fail to respond.
All my apps are running on a single OVH VPS. Knowing this, I couldn't set up a monitoring tool on the same infrastructure in case of a global failure.
Finding another hosting platform #
Having used Next.js a lot at my latest job, I had deployed many things on Vercel's platform. I also knew a free tier was available that allowed hosting small apps with low traffic for personal use: a status checker app was the perfect use case.
On top of that, a project-specific CRONTAB allows for easy task scheduling.
The API #
The synergy between Next.js and Vercel led me to spin up a minimalist Next.js app exposing a single /api/check endpoint.
When this route, protected by a secret, is called, a simple .json configuration file is parsed. From it, a collection of URLs to check is iterated over. On success, everything is fine and the script continues. On failure, it retries a configurable number of times. Definitive errors are listed in a simple report sent via email through nodemailer, alerting me to any app failure relatively quickly. I couldn't think of a simpler solution.
Below is the content of such an email:
The following endpoint failed health checks:
Name: jeantinland.com
URL: https://www.jeantinland.com
Attempts: 3
Timeout: 3000ms
Checked at: 2026-01-20T17:49:36.211Z
Error: HTTP 403 ForbiddenTriggering the checkup #
My first approach was simply to set up a repeating CRON task every hour of the day, except the "Hobby" plan wouldn't allow more than a daily task. A status checker that checks whether things are working properly only once a day isn't really useful. I'm not running critical services that need permanent observability, but triggering a check every hour seemed like the right interval to aim for when I imagined the solution.
The missing piece #
As the integrated CRONTAB wasn't an option, I first created a local CRON job on my laptop, knowing well enough it was only a band-aid as it was going to fail as soon as I closed the lid.
Then, it clicked.
The real need was to be able to send a GET request reliably every hour. And if my laptop isn't open all day long, my phone is.
Thanks to the "Automation" system available out of the box on iPhone, it is possible to do exactly that.
I created 15 identical tasks:
- When: "Every hour from 07:30AM to 09:30PM"
- Do: "Get contents of
.../api/check?secret=xxx"
That's it.
Afterthought #
Looking at this setup, one could also eliminate the intermediate API and use only iOS Shortcuts by creating an automation for each app to monitor and analyze the returned content in order to detect failures.
This approach would multiply the number of automations needed by the number of checks required for each app throughout the day.
The API allows me to centralize everything in a single place and handle check and retry logic.