Hora
A lightweight, multi-vantage, self-hosted uptime monitor in Rust. Born of one demand: few resources, alerts that matter. It watches this very site: the Status page runs on it.
- Role
- Design, development, documentation, operation
- Period
- 2026
- Stack
- Rust (tokio), axum, askama, SQLite, rustls, hickory-dns, Astro Starlight


The brief
My services run on two servers and a home network. I wanted a lightweight monitor that alerts only for a real outage. I wrote Hora, a self-hosted uptime monitor in Rust, and released version 0.1.0 on 7 June 2026. It now monitors the infrastructure of synthe.se, this site included.
In use
Hora checks services over HTTP, TCP, ICMP and DNS, and receives heartbeats from scheduled tasks and backups. It also tracks the expiry of TLS certificates and domains, and new releases of the monitored software.
Before alerting, Hora confirms the outage. A failed check is retried one second later, and it takes three consecutive failures, the default threshold. The other instances then check the same target from their network, within ten seconds at most.
If ten services depend on a database that is down, Hora sends a single alert, which names the database as the cause. The alert goes out on Telegram, Matrix, by email or on another channel, and a notification follows on recovery.
The status page says in one sentence whether everything is working. Each monitor has its own page: a 24-hour chart, a latency heatmap, the result from each vantage point. On the command line, hora tune replays the history to show the alerts another threshold would have produced.


Architecture
A single Rust binary serves as daemon, CLI and terminal dashboard. Each monitor runs in its own async task: a slow target slows only its own loop.
Checks, incidents and their hourly and daily aggregates fit in one SQLite file. The web side reads an in-memory snapshot, rebuilt in the background; the public page, the JSON API and the Prometheus metrics are drawn from it.


Decisions
All configuration in one file. A TOML file, hot-reloaded, identical on every instance and versioned in git.
Equal instances. Each instance works on its own and monitors the others: the failure of one node leaves the others running.
When in doubt, alert. An outage is classed as local only if all the other instances that answered see the target online; the page then shows “Not an outage” and the notification goes to a secondary channel. In every other case, the alert goes out normally.
One data file. Backup covers a single SQLite file, and hora compact reclaims unused space.
Accessible and verified. Each state is signalled by a colour, a shape and a word. Continuous integration runs clippy in pedantic mode, cargo-deny and cargo-audit, and the code is entirely in safe Rust.
Today
Hora is at version 0.11.1, under the MIT licence, documented at uplg.github.io/hora. Version 0.11.0 was tested on 575 million checks and 700 monitors: the status page renders in under 1.5 ms in 99% of cases, compared with 13 s before, it weighs 71 KB instead of 6.5 MB, and peak memory went from 887 MB to 353 MB.
Two instances monitor my infrastructure from two networks, and the Status page of synthe.se shows their public summary, reread every 30 seconds.