Mafl is the clean, minimal home dashboard for your self-hosted stack — card-based service bookmarks, built-in HTTP health checks, weather widgets, and a YAML config that is genuinely readable. But here is the irony: the dashboard that monitors all your other services has no monitoring of its own. If Mafl goes down, you lose your entire service index. You cannot tell what else might be failing.
Vigilmon closes that loop. Add uptime monitoring to Mafl itself — the web server, config loading, health check aggregation, and widget data feeds — so you have visibility into your visibility layer.
What You'll Set Up
- Mafl web server availability (port 3000)
- Configuration YAML parse health via startup probe
- Built-in service health check aggregation monitoring
- Widget data freshness heartbeat
- Static asset serving health
- TLS certificate expiry alerts
Prerequisites
- Mafl running via Docker or Node.js (default port
3000) - Mafl accessible over HTTP or HTTPS from your monitoring host
- A free Vigilmon account
Step 1: Monitor Mafl Web Server Availability
The Mafl web server serves the Nuxt.js SPA that renders your dashboard. If the Node.js process crashes or the Docker container stops, your entire service index disappears.
- Log in to vigilmon.online and click Add Monitor.
- Set Type to
HTTP / HTTPS. - Enter your Mafl URL:
http://mafl.yourdomain.com:3000/(orhttps://mafl.yourdomain.com/if behind a reverse proxy). - Set Check interval to
1 minute. - Set Expected HTTP status to
200. - Click Save.
Mafl's root path serves the SPA shell. A 200 response confirms Node.js is alive and the Nuxt server-side rendering layer is serving pages.
Step 2: Monitor Mafl's Built-In Health Check API
Mafl performs HTTP health checks against configured services and exposes the results through its API. Monitoring this endpoint verifies that Mafl's health check scheduler is running and collecting data — not just that the web server is alive.
- Add a new HTTP monitor in Vigilmon.
- URL:
http://mafl.yourdomain.com:3000/api/services - Expected HTTP status:
200 - Check interval:
2 minutes - Click Save.
A 200 response confirms:
- The Mafl API layer is serving requests
- The service configuration was loaded successfully from the YAML file
- The health check scheduler has initialized
If the YAML config has a parse error, Mafl typically fails to start entirely — the /api/services endpoint will return a non-200 status or connection refused.
Step 3: Monitor Configuration Health via Startup Probe
Mafl reads its service definitions from a YAML config file (config.yml) at startup. A malformed config (after an edit) prevents Mafl from starting, leaving your service dashboard blank.
Set up a cron heartbeat that watches for Mafl's successful initialization:
- In Vigilmon, go to Add Monitor → Cron / Heartbeat.
- Set expected interval to 5 minutes.
- Copy the heartbeat ping URL.
On your Mafl host, create a cron job:
# /etc/cron.d/mafl-health
*/5 * * * * root \
STATUS=$(curl -fsS -o /dev/null -w "%{http_code}" http://localhost:3000/api/services) && \
[ "$STATUS" = "200" ] && \
curl -fsS "https://vigilmon.online/api/heartbeat/YOUR_TOKEN" > /dev/null
If you edit config.yml and introduce a YAML syntax error, Mafl will crash on the next restart, the heartbeat will stop firing, and Vigilmon will alert you.
Step 4: Monitor Widget Data Freshness
Mafl's weather widget and network stat widgets pull from external APIs. If those APIs become unreachable (DNS failure, API key expiry, rate limiting), widget cards will show stale or empty data.
Directly probe the weather API that Mafl uses. Mafl's default weather source is the Open-Meteo API (no key required):
- Add an HTTP monitor in Vigilmon.
- URL:
https://api.open-meteo.com/v1/forecast?latitude=51.5&longitude=-0.1¤t_weather=true - Expected HTTP status:
200 - Check interval:
10 minutes
Why monitor this? If Open-Meteo is down, Mafl's weather widget silently fails. Knowing the external API is unavailable tells you whether a broken widget is a Mafl problem or an upstream problem.
Step 5: Monitor Static Asset Serving
Mafl serves CSS, JavaScript, and icon assets from the Nuxt build output. If the static file serving layer breaks (file permissions issue, Docker volume mount lost), the SPA loads but renders as a blank page — the web server returns 200 but the app is broken.
Add a check for a known Mafl static asset:
-
Add an HTTP monitor in Vigilmon.
-
URL:
http://mafl.yourdomain.com:3000/_nuxt/(or check for a specific Mafl icon)Alternatively, use the favicon which is always present:
http://mafl.yourdomain.com:3000/favicon.ico -
Expected HTTP status:
200 -
Check interval:
5 minutes
A 404 on static assets while the root returns 200 indicates a broken build or missing Docker volume mount.
Step 6: Configure TLS Certificate Monitoring
If Mafl is behind a reverse proxy (Nginx Proxy Manager, Caddy, Traefik — all common in the same homelab that runs Mafl), monitor the TLS certificate:
- Add an SSL Certificate monitor in Vigilmon.
- Domain:
mafl.yourdomain.com - Alert threshold: 14 days before expiry.
- Click Save.
An expired certificate locks every team member out of the dashboard simultaneously — right when you need to check service statuses.
Step 7: Configure Alerting
Mafl is your service index. When it's down, you're navigating blind. Configure immediate alerts:
- In Vigilmon, navigate to Alert Settings.
- Add email alerts for the Mafl web server monitor: notification after 1 failed check.
- Add a webhook to your notification system (Ntfy, Gotify, Discord) so you get a push notification on your phone.
- For the configuration heartbeat, alert after 1 missed check (10 minutes).
Since Mafl is a homelab dashboard rather than a production SaaS, immediate email notification is usually sufficient. The goal is knowing within a few minutes, not being paged at 3am.
Sample Mafl config.yml with Health Check URLs
To get the most out of monitoring Mafl's built-in health checks, configure it to check your services with explicit health endpoints:
services:
- title: Nextcloud
url: https://nextcloud.yourdomain.com
description: File sync
icon: nextcloud
status:
url: https://nextcloud.yourdomain.com/status.php
- title: Jellyfin
url: https://jellyfin.yourdomain.com
description: Media server
icon: jellyfin
status:
url: https://jellyfin.yourdomain.com/health
- title: Vaultwarden
url: https://vault.yourdomain.com
description: Password manager
icon: bitwarden
status:
url: https://vault.yourdomain.com/alive
Mafl's health check scheduler will probe these URLs and aggregate results. Vigilmon's monitoring of the /api/services endpoint confirms these aggregations are being collected.
Summary: Full Mafl Monitoring Coverage
| Monitor | URL / Target | Expected Status | Interval |
|---|---|---|---|
| Web server | http://mafl.domain:3000/ | 200 | 1 min |
| Services API | http://mafl.domain:3000/api/services | 200 | 2 min |
| Config health heartbeat | Cron → heartbeat URL | Heartbeat | 5 min |
| Open-Meteo weather API | https://api.open-meteo.com/... | 200 | 10 min |
| Static assets / favicon | http://mafl.domain:3000/favicon.ico | 200 | 5 min |
| TLS Certificate | mafl.domain | 14-day alert | daily |
Conclusion
Mafl's simplicity is its strength — a YAML file and a Docker container and you have a beautiful service dashboard. That simplicity also means it has no self-monitoring. Adding Vigilmon takes five minutes and ensures your service index is always available when you need it most — when something else in your homelab is already broken.