Extending Uptime Kuma: 90-day heartbeats, a Slack command, and shipping a fork
I run status.omnidim.io on Uptime Kuma, which is great, but it only shows a short window of history on its heartbeat bars. I wanted 90 days at a glance. Turns out the configurable range isn’t in a stable release yet. It only exists as an unmerged draft PR (#5916).
So instead of waiting for it to land, I built a custom image from the fork and shipped it.
The 90-day range#
The feature adds a range selector (auto, 6h, all the way to 365 days) and buckets the heartbeat data so the bar stays readable across a long window. The page now aggregates into a fixed number of time buckets across the chosen range instead of trying to draw every beat. Once I had a custom image, turning it on was a single stored value per status page.
A Slack /incident command#
While I was in there, I added something I’d wanted for a while: posting incidents to the status page straight from Slack.
/incident Backend is slow | investigating | eta 2h | warning
It verifies Slack’s request signature (HMAC, with a replay window), parses the title, details, ETA, and severity, and pins the incident to the page. /incident resolve clears it. No dashboard round-trip when something’s on fire, which is exactly when you don’t want one.
There’s also a small bulk-add script for creating a batch of HTTP monitors from a JSON file, idempotent on name, so standing up monitoring for a fleet of services isn’t a click-fest.
Open-sourcing it properly#
I published the whole thing as uptime-kuma-extended, MIT, with attribution to upstream and to the PR author whose work the range feature is built on.
If you want a longer heartbeat history or a Slack incident hook on your own Uptime Kuma, the repo is there to fork.