tutorial

Monitoring Mafl Dashboard with Vigilmon

Mafl is a minimalist self-hosted home dashboard for your services. Learn how to monitor its web server, configuration health, built-in service health checks, widget data freshness, and TLS certificate expiry with Vigilmon.

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.

  1. Log in to vigilmon.online and click Add Monitor.
  2. Set Type to HTTP / HTTPS.
  3. Enter your Mafl URL: http://mafl.yourdomain.com:3000/ (or https://mafl.yourdomain.com/ if behind a reverse proxy).
  4. Set Check interval to 1 minute.
  5. Set Expected HTTP status to 200.
  6. 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.

  1. Add a new HTTP monitor in Vigilmon.
  2. URL: http://mafl.yourdomain.com:3000/api/services
  3. Expected HTTP status: 200
  4. Check interval: 2 minutes
  5. 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:

  1. In Vigilmon, go to Add Monitor → Cron / Heartbeat.
  2. Set expected interval to 5 minutes.
  3. 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):

  1. Add an HTTP monitor in Vigilmon.
  2. URL: https://api.open-meteo.com/v1/forecast?latitude=51.5&longitude=-0.1&current_weather=true
  3. Expected HTTP status: 200
  4. 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:

  1. Add an HTTP monitor in Vigilmon.

  2. 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
    
  3. Expected HTTP status: 200

  4. 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:

  1. Add an SSL Certificate monitor in Vigilmon.
  2. Domain: mafl.yourdomain.com
  3. Alert threshold: 14 days before expiry.
  4. 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:

  1. In Vigilmon, navigate to Alert Settings.
  2. Add email alerts for the Mafl web server monitor: notification after 1 failed check.
  3. Add a webhook to your notification system (Ntfy, Gotify, Discord) so you get a push notification on your phone.
  4. 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.

Start monitoring Mafl for free at Vigilmon →

Monitor your app with Vigilmon

Free plan — 5 monitors, no credit card required. Up and running in 60 seconds.

Start free →