Skip to content
FlareWatch

Docs and changelog for v3.5.0.

v3.5.0What's new

Uptime monitoring and a status page, free on Cloudflare.

FlareWatch checks your sites, APIs and cron jobs every minute and tells you when they break. It runs on Cloudflare Workers in your own account, so there's no server to look after. Fork it, edit one config file, push.

Checks
every 1 min
Setup
~10 min
Cost
free tier

Websites (2 monitors)

  • Website38msFRA100.00%
  • Docs52msFRA99.98%

APIs (2 monitors)

  • API143msFRA99.86%
  • DatabasePrivate12msFRA100.00%

Scheduled jobs (1 monitor)

  • Nightly backupon time
Live demo: 6 of 6 up, checked a minute ago

What it watches

Websites, APIs, ports and the jobs that run at night

Checks run every minute from Cloudflare's network, or less often if you like. When a monitor fails, it turns red on your page and sends an alert.

TCP ports

Databases, mail servers, game servers. The Worker opens a connection to the host and port.

db.example.com:5432 open

Heartbeats for cron jobs, backups and CI

The job pings FlareWatch when it finishes. If the ping is late, never arrives, or reports a failure, you hear about it.

Cron job monitoring
Nightly backuplast 26 runs
  1. on time
  2. on time
  3. on time
  4. on time
  5. on time
  6. on time
  7. on time
  8. on time
  9. on time
  10. late
  11. on time
  12. on time
  13. on time
  14. on time
  15. on time
  16. on time
  17. missed
  18. on time
  19. on time
  20. on time
  21. on time
  22. on time
  23. failed
  24. on time
  25. on time
  26. running
on timelatefailedmissedrunning
$ ./backup.sh; curl -fsS \
    "https://status.example.com/ping/nightly-backup/<token>/$?"

SSL certificates

Days before a certificate expires, the monitor shows as degraded and you get one warning. An expired or invalid certificate fails the check, and so does a certificate in its last 24 hours through flarewatch-proxy. Needs Globalping or a proxy, because a Worker can't see the certificate.

DNS records

Look up an A, AAAA, CNAME, MX, TXT, NS or CAA record over DNS-over-HTTPS, and check that it holds the values you expect.

Domain expiry

FlareWatch reads the domain's expiry date over RDAP, once a day by default. When the domain expires within 30 days, or within the number of days you set, the monitor shows as degraded and you get one warning.

Other regions and private networks

Run a check from Globalping probes in another country, or through flarewatch-proxy, a small proxy you run inside your own network. Or reach a private network through Workers VPC and a Cloudflare Tunnel.

Private monitors

Checked, saved and alerted like the rest, but kept off the public page and API.

Alerts

One alert when the proxy dies, not ten

Tell FlareWatch which monitors sit behind a reverse proxy, a VPN or a shared server. When that goes down, you get one message that lists what else is down with it.

Each webhook can take only the monitors you name, and a monitor can remind you every 30 check runs or more while it stays down. When one check run has many alerts, a webhook can get one message that lists them.

Sends to

  • Slack
  • Discord
  • Telegram
  • ntfy
  • Microsoft Teams
  • Google Chat
  • Matrix
  • Pushover
  • Gotify
  • Zulip
  • Email (Resend)
  • Mattermost
  • Rocket.Chat
  • Plain text webhook
  • Any webhook
Alerts docs
Reverse proxy
  • App
  • Wiki
  • Git
  • Photos
  • Docs

Reverse proxy is down

Also down: App, Wiki, Git, Photos, Docs

1 alert

Reverse proxy is up

dependsOn: ['proxy'] on each app

Status page

A status page your users can check, and one only you can see

The same app shows visitors your public monitors and shows you everything once you sign in.
  • Uptime and response times

    90 days of uptime and incidents per monitor, and a 12-hour response time chart.

  • Public, private, or both

    Hide single monitors, or make the whole page private.

  • Sign in your way

    A password, GitHub, or any OpenID Connect provider. Give teammates read access, or let a client see only their own monitors.

  • Maintenance windows

    Planned work shows on the page, and monitors inside a window send no down alerts.

  • Announcements and a feed

    Post a notice that shows under the status banner. Incidents, maintenance and notices also go out in an Atom feed.

  • Your colours

    Edit the colour variables in one CSS file to match your brand, in light and dark.

  • Status page docs

Badges

/api/badge.svg?id=demo_example
Live status badge for a demo monitor

Embeds

/embed/demo_github_status

JSON API

GET /api/data
{
  "up": 6,
  "down": 0,
  "monitors": {
    "demo_example": {
      "up": true,
      "status": "up",
      "latency": 5,
      "location": "SIN",
      "message": "OK"
    },
    …
  }
}

Deploy

Fork, configure, push

No installer and no dashboard to click through. Your fork is the source of truth, and every push to main deploys it.
  1. 1

    Fork the repo

    Leave GitHub Actions on. The fork is your deployment.

  2. 2

    Add two secrets

    Your Cloudflare account ID and an API token. The other secrets are optional, like alert webhooks you keep out of git.

  3. 3

    List your monitors

    Monitors and alerts go in worker.ts, page settings in public.ts.

  4. 4

    Push to main

    The workflow runs the checks and deploys both Workers. The first deploy takes about ten minutes.

  5. Full deploy guide
packages/config/src/worker.ts
export const workerConfig: WorkerConfig = {
  monitors: [
    { id: 'api', name: 'API', method: 'GET', target: 'https://example.com/health' },
    { id: 'db', name: 'Database', method: 'TCP_PING', target: 'db.example.com:5432' },
    {
      id: 'backup',
      name: 'Nightly backup',
      method: 'HEARTBEAT',
      periodSeconds: 86400,
      graceSeconds: 3600,
    },
  ],
};
FLAREWATCH_WEBHOOKS optional GitHub secret
[{ "url": "https://hooks.slack.com/services/...", "template": "slack" }]

$ git commit -am "Add my monitors" && git push

✓ Deployed to flarewatch.<you>.workers.dev

Cost

Free for a personal or small-team page

FlareWatch uses two Workers, a Durable Object, one KV namespace and one cron trigger, all inside Cloudflare's free tier. Page traffic is the limit you're most likely to reach.
Cloudflare free tier limits that matter
Free tier limitWhat uses it
100,000 Worker requests/dayPage views, API calls and heartbeat pings.
100,000 Durable Object requests/dayCheck runs (1,440 a day), page views, API calls and pings.
5 million rows read/dayCheck runs (about 9,000 a day, plus 1,440 per monitor) and page views (two rows per monitor each, plus a few).
100,000 rows written/dayCheck runs (about 2,900 a day), incidents, pings and edits.
1,000 KV writes/daySign-ins.
5 cron triggers per accountFlareWatch uses one.

FAQ

Questions

Something else? Ask on GitHub.
Is it really free?

For a personal or small-team page, yes. Everything fits in Cloudflare's free tier. The limit you're most likely to hit is 100,000 Worker requests a day from page traffic.

What do I need?

A Cloudflare account on the free plan and a GitHub account. A custom domain is optional; without one the page lives on a workers.dev address.

How do I update to a new version?

Read the changelog for breaking changes first. Then open your fork on GitHub and select Sync fork, then Update branch. If the deploy doesn't start, run CI and Deploy from the Actions tab.

Where does my data live?

In your own Cloudflare account. Check history sits in a Durable Object, sign-in sessions in KV. Nothing passes through flarewatch.app.

Can I keep the page private?

Yes. Mark single monitors private, or make the whole page private so visitors only see a sign-in page. Heartbeat pings keep working either way.

Can it check services inside my home or office network?

Yes, through flarewatch-proxy, a small service you run inside that network, or through Workers VPC and a Cloudflare Tunnel. Globalping probes cover checks from other countries.

Your status page is ten minutes away.

Fork the repo, add two secrets, list your monitors, push.