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.
The interesting part wasn’t really the feature code. It was everything around shipping a fork responsibly: keeping attribution straight, sanitizing anything internal out of a public repo, and getting CI green. The last one had a nice lesson. The repo runs autofix.ci, which tries to push formatting fixes, but the bot isn’t installed on a fork so it can’t push. The fix was simply to format the code to the project’s own style before committing, so there’s no diff for the bot to make, and the check passes without it. Match the house style and the tooling leaves you alone.
If you want a longer heartbeat history or a Slack incident hook on your own Uptime Kuma, the repo is there to fork.