Why a cron job beats a monitoring dashboard
Most uptime monitors want a monthly subscription, an account, and another inbox of alert emails. If you already ship your site through GitHub, you have a scheduler, a runner and a notification channel (failed workflow runs email the repo owner by default) sitting there unused.
This setup runs on public repositories for free, needs no secrets, and every check is a plain YAML step you can read in seconds. It catches the failures that actually happen to small sites: expired certificates, a redesign that dropped the cookie banner, a redirect rule that broke after a deploy.
The complete workflow
Save as .github/workflows/site-health.yml:
name: Site health
on:
schedule:
- cron: '0 6 * * *' # daily at 06:00 UTC
workflow_dispatch: # also runnable manually from the Actions tab
jobs:
health:
runs-on: ubuntu-latest
steps:
- name: Uptime + SSL certificate expiry
uses: mahope/deskuptime@v1
with:
url: https://your-site.com
- name: EU compliance intact (privacy policy, headers, meta)
uses: mahope/compliance-site-check@v2
with:
url: https://your-site.com
Replace your-site.com with your domain. Both actions pin floating major tags, so bug fixes arrive automatically without breaking changes.
What each action checks
deskuptime@v1
Fetches the URL and fails if the page does not respond correctly, warns when the SSL certificate is close to expiry, and can detect unwanted content changes. Zero dependencies — no npm install, no config files.
compliance-site-check@v2
Nine GDPR/EAA-oriented checks against the live page: privacy-policy reachability, cookie-consent signals, security headers (CSP, HSTS, XFO), SEO meta tags and language declaration. A silent regression turns red before your users or a regulator notice.
Two more steps for teams that publish content
The same workflow can carry two optional jobs:
- Content integrity:
mahope/clean-copy-cli@v1converts a live page to Markdown inside the workflow and exposes it as step outputs — useful to snapshot documentation or diff a changelog between runs. - Bug-report quality: if you collect in-app reports with bugbottle,
mahope/bugbottle-action@v1validates collected reports in CI so low-quality submissions never reach your issue tracker.
Scheduling tips
- Cron times on GitHub Actions are in UTC.
'0 6 * * *'is 08:00 in Copenhagen (CEST). - Scheduled workflows only run on the default branch, and can be delayed a few minutes during peak hours — fine for daily monitoring, not for sub-minute alerting.
- GitHub disables schedules on repos with no activity for 60 days; any commit re-enables them. Pinning a comment or bumping a date keeps an idle repo alive.
What it replaces
Uptime-monitoring SaaS typically starts around $10–15/month per site ($120–180/year per site), and a manual compliance review starts in the thousands. This stack costs nothing on public repos and fits in one file you own. For sub-minute paging during incidents, dedicated monitoring still has a place — but for "did my site silently break?", a daily cron job catches it within 24 hours at zero cost.
Related guides
Try the compliance half right now
No repo needed to see what the scanner finds on your live site — free, no signup, results in about a minute.
Scan your site free →