tutorial

Castopod Monitoring with Vigilmon: Web UI, API Health, RSS Feeds, Media Storage & Episode Publish Heartbeat

Monitor your self-hosted Castopod podcast hosting platform with Vigilmon — track web UI availability, API health, RSS feed generation, media storage, SSL certificates, and scheduled episode publish job heartbeats.

You host your podcast on Castopod so subscribers get your episodes through their own podcast app, not a third-party platform's algorithm. The morning your biggest episode dropped, the episode had been "published" in the Castopod admin panel for hours — but the RSS feed still showed the previous episode. The scheduled episode publish job had failed silently overnight. Your subscribers' apps didn't pick up the new episode. You only found out when a listener emailed to ask why nothing had updated.

Castopod is a self-hosted podcast hosting platform with a built-in admin panel, RSS feed generation, ActivityPub federation, and episode scheduling. Because it powers the primary distribution channel for your content, failures here mean listeners miss episodes. Vigilmon gives you the external monitoring to catch Castopod failures — from a crashed web server to a broken RSS feed — before your subscribers notice.

This tutorial walks through monitoring Castopod end-to-end with Vigilmon.

What You'll Build

  • A Vigilmon HTTP monitor on the Castopod web UI
  • An API health endpoint check
  • RSS feed generation checks
  • Media storage availability monitoring
  • SSL certificate expiry alerts
  • A heartbeat for the scheduled episode publish job

Prerequisites

  • A running Castopod instance (v1.x or later)
  • A free account at vigilmon.online
  • Your podcast handle/slug (used in RSS feed URLs)

Step 1: Monitor the Castopod Web UI

The Castopod web interface serves your podcast's public-facing website and admin panel. A 200 response confirms that the PHP-FPM process and your web server (Apache or Nginx) are running and serving requests.

Test it:

curl -I https://podcast.yourdomain.com/

You should see 200 OK with an HTML response. The page will contain your podcast name and episode listings.

Set up the Vigilmon monitor:

  1. Log in to Vigilmon and click New Monitor → HTTP.
  2. Set URL to https://podcast.yourdomain.com/.
  3. Set Check interval to 60 seconds.
  4. Set Expected status code to 200.
  5. Save the monitor.

Step 2: Monitor the API Health Endpoint

Castopod exposes API endpoints for episode management, analytics, and feed generation. You can verify the API layer is healthy by checking the base API path.

Test it:

curl -I https://podcast.yourdomain.com/api/rest/v1/

A 200 OK or 401 Unauthorized response (when authentication is required) confirms the API routes are registered and PHP is handling requests. A 502 Bad Gateway or 404 points to a PHP-FPM or web server configuration issue.

Set up the monitor:

  1. Click New Monitor → HTTP in Vigilmon.
  2. Set URL to https://podcast.yourdomain.com/api/rest/v1/.
  3. Set Expected status codes to 200, 401.
  4. Set Check interval to 60 seconds.
  5. Save.

Step 3: Monitor RSS Feed Generation

Your podcast's RSS feed is the delivery mechanism for all subscriber apps. Apple Podcasts, Spotify (via RSS), Overcast, and every other podcast app polls this URL to pick up new episodes. A broken RSS feed means zero episode delivery regardless of whether episodes are published in the admin panel.

Test it:

curl https://podcast.yourdomain.com/@your-podcast-handle/feed.xml

Healthy response:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" ...>
  <channel>
    <title>Your Podcast Name</title>
    ...
  </channel>
</rss>

The feed must return valid XML with your podcast title and at least your most recent episode. Replace your-podcast-handle with the actual handle you configured in Castopod.

Set up the monitor:

  1. Click New Monitor → HTTP in Vigilmon.
  2. Set URL to https://podcast.yourdomain.com/@your-podcast-handle/feed.xml.
  3. Set Expected status code to 200.
  4. Under Advanced → Keyword check, add:
    • Keyword present: <rss
    • Keyword present: your podcast title
  5. Set Check interval to 5 minutes.
  6. Save.

Monitor this with a 5-minute interval — RSS feed failures need rapid detection since podcast apps poll on their own schedule and late episodes are noticed quickly.


Step 4: Monitor Media Storage Availability

Podcast episode audio files are served directly from your Castopod storage. If the media storage directory is unmounted, full, or permissions-broken, episode downloads will fail even if the RSS feed updates correctly. You can probe media availability by checking an existing episode audio URL.

Find a direct episode audio URL from your RSS feed (<enclosure url="...">), then:

curl -o /dev/null -s -w "%{http_code}" \
  "https://podcast.yourdomain.com/media/episodes/your-episode.mp3"

You should get 200 OK (or 206 Partial Content if range requests are supported).

Set up the monitor:

  1. Click New Monitor → HTTP in Vigilmon.
  2. Set URL to the audio file URL from your most recent episode.
  3. Set Expected status code to 200.
  4. Set Check interval to 5 minutes.
  5. Save.

Update this URL whenever you publish a new episode, or use a stable episode you intend to keep permanently.


Step 5: Episode Publish Job Heartbeat

Castopod supports scheduled episode publishing — you set a publish date/time in the future and the job runs automatically. If the cron job that triggers scheduled publishing fails, episodes accumulate in the queue and never go live on schedule.

Step 5a: Create the Vigilmon heartbeat.

  1. Click New Monitor → Heartbeat in Vigilmon.
  2. Set Name to Castopod Scheduled Publish Job.
  3. Set Expected interval to 10 minutes.
  4. Set Grace period to 5 minutes.
  5. Save and copy the heartbeat ping URL.

Step 5b: Add the heartbeat ping to your cron job.

Castopod uses CodeIgniter's spark task runner for scheduled jobs. Add a ping to your existing cron entry:

# /etc/cron.d/castopod
*/10 * * * * www-data cd /var/www/castopod && php spark tasks:run \
  && curl -s https://vigilmon.online/heartbeat/abc123

If php spark tasks:run fails (non-zero exit), the && short-circuits and the heartbeat is never pinged, triggering a Vigilmon alert. This catches PHP errors, missing cron configuration, and job runner failures before they delay your episode schedule.


Step 6: SSL Certificate Monitoring

Podcast apps downloading episodes over HTTPS will reject connections with invalid or expired certificates. Apple Podcasts and Spotify both require valid HTTPS for feed and media URLs. An expired certificate silently breaks downloads for all subscribers.

Vigilmon monitors SSL certificate validity automatically on all HTTPS monitors.

  1. Open your Castopod web UI monitor in Vigilmon.
  2. Under Advanced → SSL, ensure Alert before expiry is enabled.
  3. Set the alert lead time to 14 days.
  4. Save.

Enable the same SSL alert on your RSS feed and media file monitors.


Step 7: Alert Channels

Go to Notifications → New Channel in Vigilmon and configure:

  • Email — for the podcast producer or admin
  • Webhook — for Slack or Discord

A failed heartbeat alert looks like:

🔴 DOWN: Castopod Scheduled Publish Job (Heartbeat)
No ping received in the last 15 minutes (expected every 10)
Triggered: 2026-06-01 08:10 UTC

What You've Built

| Scenario | How Vigilmon catches it | |---|---| | PHP-FPM or web server crash | Web UI monitor fails | | API routing broken | API health monitor returns 502 | | RSS feed generation failure | RSS monitor detects missing <rss tag | | Media storage unmounted or full | Media file monitor returns 404/500 | | Scheduled publish job failure | Heartbeat monitor times out | | SSL certificate expired | HTTPS monitors report TLS error | | Database connectivity issue | Web UI and API monitors degrade/fail |


Castopod puts you in control of your podcast's distribution — but that control depends on a server that stays running and a cron job that fires on schedule. Vigilmon's external monitoring closes the gap between "published in the admin panel" and "delivered to subscribers."

Start monitoring your Castopod instance today — register free at vigilmon.online.

Monitor your app with Vigilmon

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

Start free →