Introduction
"A fancy self-hosted monitoring tool."
This is the 261st article in the "One Open Source Project a Day" series. Today's project is louislam's Uptime Kuma.
Personal sites, home services, a small team's internal systems: they all share one plain need, which is to know right away when something goes down. Commercial services such as Uptime Robot can do it, but free tiers are limited and your data lives with someone else. Uptime Kuma's answer is to run one yourself on a machine you control, with a good-looking UI and simple setup, pushing a message to Telegram or a similar channel when something fails.
It is one of the most popular ops projects on GitHub, with about 94k Stars. This article follows the README and repo metadata; I did not deploy it or run these commands.
What You Will Learn
- What Uptime Kuma can and cannot monitor
- Several ways to deploy it, with Docker or Node directly, and the limits that are easy to trip over
- The two most used features: status pages and notification channels
- The project's positioning, its limits, and when not to use it
Prerequisites
- Basic Docker use, or the ability to install Node.js on Linux
- A basic idea of "monitoring, alerting, and status pages"
- Optional: having used Uptime Robot or a similar service
Project Background
What It Is
The author is plain about it in the README: he wanted a replacement for Uptime Robot, found statping unstable and no longer maintained, and so wrote his own. Side goals included building a good-looking UI, learning Vue 3 and vite.js, showing off Bootstrap 5, using WebSocket with a single-page app instead of traditional REST, and publishing his first Docker Hub image.
Project Stats
- ⭐ GitHub Stars: about 93,609
- 🍴 Forks: about 8,706
- 💻 Language: JavaScript
- 📅 Created: 2021-07-03; last pushed 2026-11-13; latest release 2.5.11 (2026-11-12)
- 📄 License: MIT
- 👤 Author: louislam
- 🌐 Website: uptime.kuma.pet
What It Does
The Problem It Solves
Without monitoring:
A site or service goes down → you find out when users complain
↑ slow diagnosis, bigger losses
With Uptime Kuma:
Check your services on a schedule → alert when they are unreachable
↓ messages go to the channels you already use
↑ and users get a public status pageCore Capabilities
| Capability | Description |
|---|---|
| Monitor types | HTTP(s), TCP, HTTP(s) keyword, HTTP(s) JSON query, Websocket, Ping, DNS record, Push, Steam game server, Docker container |
| Check interval | As short as every 20 seconds |
| Notifications | Telegram, Discord, Gotify, Slack, Pushover, email (SMTP), and more, over 90 in total |
| Status pages | Multiple pages, mappable to specific domains |
| Other | Reactive, fast UI, multiple languages, ping chart, certificate info, proxy support, two-factor authentication (2FA) |
Quick Start
Option 1: Docker Compose
mkdir uptime-kuma
cd uptime-kuma
curl -o compose.yaml https://raw.githubusercontent.com/louislam/uptime-kuma/master/compose.yaml
docker compose up -dOption 2: A single Docker command
docker run -d --restart=always -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:2Both serve on port 3001 and listen on all network interfaces by default. To limit access to the local machine, change the port mapping to -p 127.0.0.1:3001:3001.
Option 3: Without Docker
git clone https://github.com/louislam/uptime-kuma.git
cd uptime-kuma
npm run setup
# Try it first
node server/server.js
# Recommended: run in the background with PM2
npm install pm2 -g && pm2 install pm2-logrotate
pm2 start server/server.js --name uptime-kumaHandy PM2 commands: pm2 monit to view console output, and pm2 startup && pm2 save to start at boot.
Requirements
- Node.js 20.4 or later
- Git
- pm2 for background running
Supported platforms
- Major Linux distributions (Debian, Ubuntu, Fedora, ArchLinux, and others)
- Windows 10 (x64) or Windows Server 2012 R2 (x64) and newer
- Not supported: FreeBSD, OpenBSD, NetBSD, Replit, Heroku
To see it first, use the official demo site; its data is wiped after 10 minutes.
A Deeper Look
Usage Details Worth Knowing
1. Choose the right monitor type to catch real failures
- To test only whether a port is reachable, TCP is enough
- If the site opens but the page content is broken, use an HTTP(s) keyword monitor to check that a certain word is on the page
- If an API returns 200 but the data is wrong, use a JSON query monitor to check a field in the response
- To know whether scheduled jobs (backups, syncs) ran on time, use a Push monitor: the job calls an address provided by Uptime Kuma when it finishes, and if nothing arrives for a while, you get an alert
- If a service runs in a container, you can monitor the Docker container's status directly
2. Status pages
A status page is for "other people": pick a few monitors, put them on a public page, and optionally bind your own domain. For personal projects and small teams, this is much less work than building one yourself.
3. Where data lives
-v uptime-kuma:/app/data in the Docker command is the data volume. The README specifically warns: network file systems such as NFS are not supported, so map to a local directory or volume, or you may run into problems.
4. Notification channels
The README says there are over 90. The common ones, Telegram, Discord, Slack, and email, are in there. I did not check each channel's configuration fields one by one; go by the fields shown in the UI when you set one up.
The Project's Technical Choices
The README's own account shows a few choices by the author: Vue 3 with vite.js on the front end, Bootstrap 5 for styling, WebSocket between front and back end, and a single-page app instead of a traditional REST interface. Translations are done collaboratively through Weblate, with files under src/lang.
Limits and Cautions
Stated in the README:
- Network file systems (such as NFS) are not supported for the data directory
- The author does not give support by email; use GitHub Issues or r/UptimeKuma
- The author says many PRs are waiting and he lacks time to test them all
uptimekuma.cois not the official site and is not controlled by the project
Two more points are my own judgment:
- It is a single-instance tool: the monitoring runs on one of your machines, and if that machine or its network has problems, the monitoring fails with it. For important cases, add an external probe too, or deploy Uptime Kuma on a different network from the services it watches
- Its depth is limited: it is good at availability checks ("is it up, is it fast"), not metrics and tracing like Prometheus and Grafana, so do not expect it to replace those
I also did not check what changed incompatibly between 1.x and 2.x; read the release notes before upgrading from an older version.
Sponsorship and Contributing
The project is funded through Open Collective and GitHub Sponsors, and the README names a special sponsor, Atlas Cloud, which gives USD 400 per month for use of its AI models. Welcome contributions include PRs, testing PRs and betas, bug reports, feature requests, translations, and grammar fixes; upcoming work is tracked in GitHub milestones.
Project Links and Resources
- 🌟 GitHub: https://github.com/louislam/uptime-kuma
- 🌐 Website: https://uptime.kuma.pet
- 🎮 Live demo: the demo site linked in the README (data wiped after 10 minutes)
- 💬 Community: GitHub Issues, r/UptimeKuma
- 📄 License: MIT
Summary
Key Takeaways
- Clear positioning: self-hosted availability monitoring, an open-source alternative to Uptime Robot
- Enough features: ten monitor types, checks as often as every 20 seconds, over 90 notification services, and status pages you can bind to a domain
- Simple deployment: one
docker run, or Node with PM2 - Clear boundaries: no NFS, not a replacement for metrics monitoring, and a single instance can itself fail
- Limited maintainer bandwidth: PRs queue up, and support runs through Issues and the community only
Who This Is For
- Developers with personal sites or self-built services who want low-cost monitoring
- Small teams monitoring the availability of internal services
- Anyone who wants a public status page for a product
Suggested First Steps
Click around the official demo first to get familiar with monitor types and notification settings. Then install one on a small machine with docker run, monitor one of your own sites, set up Telegram or email notifications, and deliberately stop the service to confirm the alert arrives. Once it works, consider binding a status page to your own domain.
Check out PrimeSkills — a curated marketplace of AI agents and skills that have been validated in real-world, enterprise-grade workflows. No fluff, just what actually works.
Find more useful knowledge and interesting products on my Homepage