Most self-hosted uptime monitors are fine until they aren't. Uptime Kuma is the community default, it has 88k stars and roughly 40 monitor types, and it deserves every bit of that. But it pushes full state to every connected browser over Socket.IO, so somewhere around 300 to 600 monitors the dashboard becomes unusable. The community workaround is to run a second Kuma on another host. Then a third.
I have spent the last several months building Uptime Cairn as an answer to that specific wall, and to a few others. This post is what it can do right now, the one decision that shaped everything else, and an honest list of what is still missing. If you run more than a handful of checks, the last section is probably the one you want.
What it does today
It watches HTTP and HTTPS endpoints (status code, keyword, JSON path, regex, response time threshold), TCP ports, ICMP, DNS records, Docker containers, gRPC services, and push heartbeats for cron jobs that are supposed to check in. It also watches the two things that quietly kill you on a Sunday: TLS certificates and domain registrations approaching expiry.
When something breaks it tells you over email, Slack, Discord, Telegram, Matrix, ntfy, Gotify, Teams, PagerDuty, Opsgenie, SMS or a webhook. Apprise ships as a meta-provider, which adds roughly ninety more destinations without ninety more integrations to maintain. Webhook payloads are user-defined: your own body, headers and method, with variable interpolation like {{monitor.name}} and {{response_time}}, and a live preview so you find out the JSON is malformed before an incident does.







