Site reliability for every project your team ships.
Monita checks the URLs and cron jobs of every project your team runs. When one fails, it opens an incident, alerts the people you choose, and shows the outage on a public status page. You run it on your own server.
What Monita keeps for each project
A project in Monita has monitors, heartbeats, incidents, tickets and a changelog. Moni, the Monita mascot, shows what each one does. The same drawings sit at the foot of each page in the app.
-
Monitors
Monita checks a health URL, a TCP port, a DNS name or a host by ping, every 30, 60, 180 or 300 seconds. An HTTP check can send a POST with headers, require a word in the body, and warn before its certificate expires. Add locations to check from more than one place.
How monitors work -
Heartbeats
A scheduled job calls its ping URL when it finishes. If the call does not arrive within the period and the grace time, Monita opens an incident. A call to
How heartbeats work/failopens one at once. -
Incidents
Failed checks open an incident, an alert goes out by email and to Slack, Discord, Telegram, ntfy or PagerDuty, and the first passing check closes it. The team posts updates to the public status page, and plans maintenance windows that raise no alarm.
How incidents work -
Tickets
Users report bugs from the status page or from your app. The tech lead sorts the reports on a ticket board. A report stays private until it leaves Triage, and its description never becomes public.
How tickets work -
Changelog
The team writes each release into the project's changelog. Users read the releases on the status page, newest first.
How the changelog works
Built for every team in the IT department
One Monita serves every project. Each tech lead runs their own projects, and the department sees all of them in one place.
- Roles that match the department. A super admin runs Monita, each tech lead manages the projects they own, and a supervisor sees every project without changing anything.
- Alerts where your team already talks. Each project has alert cards for email lists, Slack and Google Chat, Discord, Telegram, ntfy and PagerDuty, and each card listens to critical alerts, warnings or both. One shared Telegram bot connects a chat with a link.
- Planned work stays quiet. A maintenance window keeps its monitors and heartbeats from opening incidents or sending alerts, and the charts draw it as stripes. A window that runs long can get more time while it is active.
- Checks from more than one place. Run
monita probeon another machine, and an incident opens only when enough places agree that a service is down. - Pause, pin and sort. Pause or resume up to 100 monitors at once, pin the projects you watch most, and mark an incident as planned work or a false alarm so it leaves the uptime numbers.
- Scripts and pipelines can drive it. An API key can only issue ticket reference IDs, read a project, or also change its monitors, heartbeats, incidents and maintenance windows.
- Sign-in with a second factor. Anyone can add an authenticator app code to their password, with recovery codes for a lost phone.
- Certificates do not expire by surprise. An HTTPS monitor can warn 7, 14 or 30 days before its certificate runs out.
Small enough to run on a server you already have
- One program and one file. Monita is a single binary that keeps all its data in one SQLite file. It does not need Docker, a separate database or a message queue.
- Light on memory. In a Docker test on a Mac, Monita used about 4 MiB of memory, as
docker statsreports it, while it checked 500 URLs every minute. Uptime Kuma used 236 MiB in the same test. A server with 512 MB of memory and 5 GB of disk is enough to start. See the benchmark. - Easy to connect. A project needs a health URL, one curl line per cron job and, for bug reports, two HTTP calls. See each one below.
- Alerts survive a restart. Monita saves every alert before it sends it, and it tries again after a failed delivery or a restart. A slow mail server never delays a check.
Install
These commands download the latest version from the releases page and install it on an x86-64 server. On an Arm server, use monita_linux_arm64.tar.gz.
curl -fsSLO https://github.com/PT-Perkasa-Pilar-Utama/monita/releases/latest/download/monita_linux_amd64.tar.gz
tar -xzf monita_linux_amd64.tar.gz
sudo install -m 0755 monita /usr/local/bin/monita
sudo monita setup
sudo monita service installmonita setup asks for the public URL, the mail server and the first admin account. monita service install starts Monita now and after every reboot.
Try Monita on a Mac with Apple silicon. On an Intel Mac, use monita_darwin_amd64.tar.gz. The data goes to ./data in the folder you run it from.
curl -fsSLO https://github.com/PT-Perkasa-Pilar-Utama/monita/releases/latest/download/monita_darwin_arm64.tar.gz
tar -xzf monita_darwin_arm64.tar.gz
export MONITA_ENV=dev
./monita admin create --email you@company.co.idThe last command asks for a password of at least 8 characters. Then start Monita:
./monita serveOpen http://localhost:7466 and sign in.
Try Monita on Windows, in PowerShell. On an Arm PC, use monita_windows_arm64.zip. The binary is not signed, so SmartScreen may ask before the first start.
curl.exe -fsSLO https://github.com/PT-Perkasa-Pilar-Utama/monita/releases/latest/download/monita_windows_amd64.zip
Expand-Archive monita_windows_amd64.zip -DestinationPath monita
cd monita
$env:MONITA_ENV = "dev"
.\monita.exe admin create --email you@company.co.idThe last command asks for a password of at least 8 characters. Then start Monita:
.\monita.exe serveOpen http://localhost:7466 and sign in.
The image runs on Linux, and on Windows and macOS through Docker Desktop. It holds the same binary, for amd64 and arm64.
docker volume create monita-data
docker run --rm -it -v monita-data:/data -e MONITA_ENV=dev ghcr.io/pt-perkasa-pilar-utama/monita:1 admin create --email you@company.co.idThe last command asks for a password of at least 8 characters. Then start Monita:
docker run -d --name monita -p 127.0.0.1:7466:7466 -v monita-data:/data -e MONITA_ENV=dev ghcr.io/pt-perkasa-pilar-utama/monita:1Open http://localhost:7466 and sign in. These commands make Monita reachable from this computer only. On a server, use the Compose file in the install guide and set MONITA_BASE_URL to the address people open, because sign-in only works on that address.
To build it yourself, see building from source. You can also try the demo in your browser first. It needs no account.
Monita beside Uptime Kuma and Gatus
Each tool checked 500 URLs every 60 seconds against one local nginx, alone in Docker on an Apple M1 with 2 vCPU. Memory and CPU are what docker stats reported every 15 seconds for 5 minutes, after a 5-minute warm-up, on 2026-10-27.
| 500 checks a minute | |||
|---|---|---|---|
| Memory under load (median) | 3.6 MiB | 236 MiB | 45.5 MiB |
| CPU, share of one core | 0.7% | 4.7% | 3.3% |
| Checks done per minute, of 500 | 500 | 464 | 500 |
| Image download (arm64) | 6.5 MB | 603 MB | 24.5 MB |
Uptime Kuma fell behind and did 464 of its 500 checks a minute. Gatus was the latest image, built on 2026-10-23. Checks of real sites over HTTPS cost more for every tool. The Uptime Kuma and Gatus logos belong to their projects.
How a project connects to Monita
Your project does not need a library or an agent. Monita calls your health URL, and your jobs and your backend call Monita over plain HTTP.
Add a monitor with your health URL in the dashboard. Every 30, 60, 180 or 300 seconds, Monita makes this request. An answer with a 2xx status within 10 seconds passes. You can also require a word in the body.
curl -fsS -m 10 https://shop.example.com/healthzAdd a heartbeat and copy its URL. The job calls the URL when it finishes. If the call does not arrive in time, Monita opens an incident. A call to /fail opens one at once, and the first kilobyte of its body becomes the cause.
0 2 * * * /opt/jobs/backup.sh && curl -fsS -m 10 https://monita.example.com/ping/<token>Pings arriving on time
Add an alert card in the project's alert settings and paste a Slack or Google Chat incoming-webhook URL. Monita posts JSON like this when an incident opens and when it closes. Other cards send to Discord, Telegram, ntfy, PagerDuty or a list of email addresses, and the project owner gets an email by default.
{
"text": "[CRITICAL] Payments / API health is down: HTTP 503, expected 2xx after 2 checks",
"event": "incident.opened",
"project": "payments",
"source": "API health",
"severity": "critical",
"cause": "HTTP 503, expected 2xx after 2 checks",
"incident_url": "https://monita.example.com/projects/payments/incidents/42",
"at": 1792137600
}Link to the project's public status page, or build your own page from its JSON. The endpoint is public and allows requests from any origin. The project's status page settings also offer an HTML template that reads it.
curl -s https://monita.example.com/api/v1/public/status/payments?days=30{ "data": { "overall": "down", "items": [ { "name": "API health", "state": "down", "uptime_90d": 99.95 } ] } }Your backend asks Monita for a reference ID with the project's API key and gives it to the user. The user then sends a ticket with it, from your app or from the status page. Monita stores only a hash of the ID, so it never learns who the user is.
curl -s -X POST https://monita.example.com/api/v1/ref-ids \
-H "Authorization: Bearer $MONITA_KEY" -H 'content-type: application/json' \
-d '{"single_use": false}'
curl -s -X POST https://monita.example.com/api/v1/tickets -H 'content-type: application/json' \
-d '{"ref_id": "rf_...", "title": "Checkout button does nothing", "description": "I click Pay and nothing happens."}'What Monita does when a check fails
This is the sequence for an HTTP monitor that checks every 30 seconds. A single failed check does not alert anyone, because one dropped request is common. The second failure in a row opens the incident. Each monitor can set its own count, from 1 to 99.
- The first check failsHTTP 503. Monita waits for the next check.
- The second check failsTwo in a row open an automatic incident.
- Your team hears about itAn email to the addresses you list and a webhook to Slack, Discord, Telegram, ntfy or PagerDuty, through an outbox that retries.
- Users see itThe status page shows the incident and every update the team posts.
- The first passing check closes itMonita sends a recovery alert with the downtime.
The pages your team and your users see
These screenshots come from the demo. Select one to see it at full size.
What Monita does not do
Read these before you install it. Each one is a choice for version 1, and some of them can change.
- It reads A and AAAA answers only. A DNS check does not look at MX, TXT or CNAME records.
- A ping check sends one echo. It reports whether the host answered and how fast, not packet loss over many echoes.
- It alerts by email, chat and PagerDuty. It does not send text messages or make phone calls itself, and it has no on-call rotation of its own.
- It signs people in with an email, a password and an optional authenticator code. Single sign-on is not in version 1.
- It keeps single checks for 7 days. Daily summaries stay for good, so the uptime history stays complete.
- Tickets hold text only. Users cannot attach files to a bug report.
See it with real data first
The demo is a copy of Monita with three sample projects, open incidents, a ticket board and changelogs. It runs in your browser and needs no account.