I want a feature in ManageWP that allows for immediate bulk health checks across all sites after running updates, rather than waiting for alerts from Uptime Kuma. This would help ensure all sites are functioning properly post-update.
I host 50+ WordPress sites and use Uptime Kuma for continuous uptime monitoring and ManageWP for maintenance. What I was missing was a way to do a thorough bulk check across all sites immediately after running updates through ManageWP. I didn't want to wait for Uptime Kuma to alert me - I wanted to get a quick view of the post-update status of all websites under management. I also wanted to track domain name and SSL expiry for these websites. I thought I'd share what I've created by using Claude in case others are interested in doing something similar. **What I built:** While I am a dev, I decided to try vibe-coding and I used Claude to build this application and it has turned out really well. Claude built me a self-hosted dashboard that runs on the same dev server as my Uptime Kuma instance, protected by Cloudflare Zero Trust as I want this blocked from public access. It's a Node.js + Express backend with a vanilla HTML/JS frontend - no database, no external APIs, all config stored in a local JSON file. **What it does:** * **Site health checks** \- hits each site's homepage and returns the HTTP status code with response time. * **Keyword verification** \- checks that a specific word or phrase is present on the homepage. If missing, retries twice with a 10 second gap before marking the site as DEGRADED. This catches situations where a WordPress update has broken the front page but the server is still returning HTTP 200. * **Domain expiry** \- manually maintained expiry dates and registrar info per domain, colour-coded by urgency. Note: You might be able to use APIs for this, but it depends on the type of domain extensions as some countries don't have open API access to domain expiry information. * **SSL certificate expiry** \- connects via TLS and reads the cert expiry directly, no external API needed. * **Settings UI** \- all domains managed from a single in-app table. Add, edit or delete domains, set keywords, expiry dates and registrars. No editing config files. * **Sortable tables** \- click any column header to sort ascending/descending. * **Colour-coded notes** \- HTTP status name and keyword result displayed in green/amber/red (e.g. "HTTP 200 OK · Keyword found" or "HTTP 503 Service Unavailable"). **Stack:** Node.js + Express, vanilla HTML/JS, PM2, Nginx reverse proxy. All data in a local JSON file. **Custom User-Agent** \- all checks identify themselves in server logs with a custom user agent so you can easily filter or whitelist them. **Status rules:** *Site Health* |Status|Condition| |:-|:-| |ONLINE|HTTP 200–399 + keyword found (or no keyword configured)| |DEGRADED|HTTP 200–399 + keyword missing after 2 retries (10s apart)| |WARNING|HTTP 4xx or 5xx response| |FAILED|No response — timeout, DNS not found, connection refused| *Domain Expiry* |Status|Condition| |:-|:-| |OK|More than 90 days remaining| |WARNING|Less than 90 days remaining| |CRITICAL|Less than 30 days remaining| |EXPIRED|Past expiry date| *SSL Certificate Expiry* |Status|Condition| |:-|:-| |OK|More than 30 days remaining| |WARNING|Less than 30 days remaining| |CRITICAL|Less than 7 days remaining| |EXPIRED|Past expiry date| Happy to share the prompt that Claude summarised at the end of the project. I must have done a few dozen revisions until I perfected things to match what suited my needs. Happy to answer questions, am also open to any enhancement ideas!