Omahub
← All plugins
M

Uptime

by Majkelll

Watch the sites you care about from the Omarchy bar, with outage history and a notification when one stops answering

Security review

Review recommended · 1 finding

Deterministic scan — not a security guarantee

Medium
Risk level
Medium
Analyzed commit
f273658
Scanned
1 month ago
  • medium external_hosts …/workflows/tests.yml:41

    Downloads or connects to an external HTTP(S) host.

    curl -sf -o /dev/null http://127.0.0.1:8111/ && break

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

Low
AI risk level
Low
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
f273658
Reviewed
1 month ago

The plugin is a straightforward uptime monitor that runs curl checks against user-configured sites and pings 1.1.1.1 for connectivity. The deterministic scan flagged a curl to 127.0.0.1 in the CI workflow, which is a local test server and not an external host, so that finding is a false positive. No obfuscation, persistence, credential theft, or destructive behavior was found.

How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/Majkelll/omarchy-uptime --enable
Developer Tools #bar #quickshell

Uptime

An Omarchy bar plugin that watches the sites you care about and tells you the moment one stops answering.

Add a site, point it at a health check path if it has one, pick how often it should be pinged, and forget about it. The bar icon stays quiet while everything answers and turns red when it does not.

The Uptime popup, with two sites up and one down

<sub>Screenshots use the Gruvbox theme — the plugin takes its colours from whichever Omarchy theme you run, including the orange it warns with.</sub>

What it gives you

  • A list you can actually keep. Add a site from the top of the popup, edit every part of it later, pause one without losing its history, open any of them in your browser with one click.
  • Its own schedule per site. A production box every 30 seconds, a staging box once an hour — they do not have to share an interval.
  • A health check path per site. https://example.com/hc, or just the site itself.
  • Alerts that mean something. A site counts as down only after a configurable number of consecutive failures, so one flaky check on café wifi never wakes you up.
  • Outage history, out of the way. Every row knows when it stopped answering, how long it was out, and what the failure was — hidden until you ask for it.
  • Rows that say what their numbers mean. Up 5m | replied in 200 ms | updated 16:03:47 — how long it has been up, how fast it answered, and the clock time that reading was taken. A green line off a check that last ran an hour ago is not the same claim as one a second old, so the line says which it is.
  • It knows the difference between your connection and theirs. Your own link to the internet is checked first. When it is down the bar icon turns orange, the popup says so in as many words, and nothing is recorded or alerted.
  • Keyboard everything. The popup never needs the mouse.

Checks run in one background service rather than once per monitor, so a three-screen desktop probes each site once and notifies once.

Install

omarchy plugin add https://github.com/Majkelll/omarchy-uptime.git --enable

Click the pulse icon in the bar and add your first site. There is nothing to configure by hand before that, and nothing is installed outside your home directory.

Removing it

omarchy plugin remove io.github.majkelll.omarchy-uptime

That unloads the widget and deletes the plugin. Your site list and its history are left alone, in ~/.config/omarchy-uptime/ and ~/.local/state/omarchy-uptime/, so reinstalling picks up where you left off. Delete those two directories to remove them as well.

Watching a site

The popup opens with the add form on top, then everything you watch:

example.com                    /hc
Check every  [ 60 ] seconds          [ + Add site ]

Type a bare host and it becomes https://. Paste a full URL with a path and the path lands in its own field. Every row then offers three things:

Click the row its outage history
Pencil button edit everything about it
Open button open it in your browser

Outage history

Hidden by default — a list of sites you are watching should read as a list of sites, not a wall of incident reports. Click a row and it tells you how it is checked and everything that has gone wrong, newest first, with an ongoing outage marked as such.

A site's outage history, expanded

Edit mode

The pencil opens every field a site has: its name, its address, its health check path, how often it is checked, how long a check may take before it counts as a failure, which status code counts as healthy, how many failures in a row count as an outage, and whether it is watched at all. Nothing is written until you hit Save, and Escape cancels.

Edit mode, with every field of a site

Stopping it

The play/pause control at the top of the popup (or p) stops every check at once. Nothing is checked, nothing is recorded and nobody is alerted until you start it again — and because no timestamps move while it is stopped, starting it checks everything immediately rather than waiting out the longest interval.

The bar icon becomes a pause mark so a stopped plugin never looks like a healthy one, and the state is written to sites.json, so it survives a restart.

The popup with checks stopped

Notifications

When a site crosses into down you get one critical notification; when it answers again you get a quiet one saying how long it was out. Clicking either opens the site.

A desktop notification reading "staging is down"

How a check works

Every site is fetched with curl, without following redirects, and judged by what comes back:

Result Verdict
Status 200–399, no expected status set up
Status matches the expected status up
Any other status down
Timeout, DNS failure, refused, TLS error down

Redirects are not followed on purpose: a 301 is a real answer from the server, and following it would quietly check a different address than the one you added.

A single failure never raises an alarm. A site is only down after failuresBeforeAlert consecutive failures — two by default. The popup still shows every individual check.

Your connection is checked first

Close the lid at the office, open it on café wifi, and every site you watch fails at the same moment — through no fault of theirs. So before any site is touched, the plugin checks whether the machine can reach the internet at all, the same way Omarchy's own network widget does it: a route to 1.1.1.1, then a one-second ping.

If that fails and nothing else answered in the same round, the whole round is thrown away. Nothing is recorded and nobody is alerted. No timestamps move either, so every site is due again the instant the connection comes back.

It says so plainly rather than quietly doing nothing: the bar icon turns orange — not the red it uses for an outage, because nothing is known to be down — and the popup leads with a banner. Every line underneath is labelled Last known, because that is what it is.

The popup with no internet connection: an orange banner and the last known state

The orange is the active theme's own, resolved the way Omarchy's omarchy-theme-color resolves it, so it is the same hue every other Omarchy surface would use for a warning.

A site that answered overrules the probe — plenty of networks serve HTTP while dropping ICMP, and a probe that cannot run must never be the reason a real outage goes unreported. If 1.1.1.1 is blackholed where you are, point the probe somewhere else:

OMARCHY_UPTIME_PROBE=9.9.9.9

as an environment variable on the shell session that runs the plugin.

Keyboard

Key Does
↑ ↓ / j k move between the add form and the sites
Enter show a site's outage history
e edit the selected site
o open it in your browser
x stop watching it
/ jump to the add form
r check everything now
p stop or start every check
Esc close the popup, or cancel an edit

Configuration

The site list lives in ~/.config/omarchy-uptime/sites.json. The popup writes it, and the plugin reloads it live when you edit it by hand — handy if you keep it in your dotfiles.

{
  "version": 1,
  "paused": false,
  "sites": [
    {
      "id": "myapp-hc",
      "name": "myapp",
      "origin": "https://myapp.example.com",
      "path": "/hc",
      "intervalSeconds": 60,
      "timeoutSeconds": 5,
      "expectedStatus": 0,
      "failuresBeforeAlert": 2,
      "enabled": true
    }
  ]
}
Field Meaning
id Stable key the outage history is filed under. Derived from the address when omitted.
name Display name. Falls back to the host.
origin Scheme and host. A missing scheme becomes https.
path Health check path, or "" for the site itself.
intervalSeconds Seconds between checks. 10 – 86400, default 60.
timeoutSeconds Per-check timeout. 1 – 60, default 5.
expectedStatus Exact status to require, or 0 for any 2xx/3xx. Default 0.
failuresBeforeAlert Consecutive failures before it counts as down. Default 2.
enabled false pauses checks while keeping the site and its history.

The top-level paused stops every check at once — the play/pause control in the popup writes it.

Anything out of range is clamped rather than rejected, and a row without a host is skipped, so a hand-edited file cannot take the plugin down with it. A file that is not valid JSON leaves the running configuration alone and says so in the popup.

Widget settings

Setting Default Effect
Only show when something is down off Hides the bar icon while every site is up.

Commands

The service registers an IPC target, so scripts and keybindings can reach it:

omarchy-shell omarchy-uptime check    # check every site now
omarchy-shell omarchy-uptime status   # "2 of 3 up - myapp is down"
omarchy-shell omarchy-uptime list     # the site list as JSON
omarchy-shell omarchy-uptime toggle   # open or close the popup
omarchy-shell omarchy-uptime pause    # stop every check
omarchy-shell omarchy-uptime resume   # start again

toggle is what a keybinding wants. In ~/.config/hypr/bindings.conf:

bindd = SUPER SHIFT, U, Uptime, exec, omarchy-shell omarchy-uptime toggle

Right-clicking the bar icon also forces an immediate check of every site. On a multi-monitor desktop the popup opens on the first bar surface that registered itself, since a popup belongs on one screen rather than all of them.

Where things live

Path What
~/.config/omarchy-uptime/sites.json the sites you watch — yours to edit
~/.local/state/omarchy-uptime/state.json current status and outage history, capped at 50 outages per site

Removing a site discards its history.

Requirements

  • Omarchy with omarchy-shell (the Quickshell bar).
  • curl and bash, plus omarchy-notification-send and omarchy-launch-browser — all part of a base Omarchy install.

No package is installed, no daemon is started, and nothing runs with elevated privileges.

Development

ln -s "$PWD" ~/.config/omarchy/plugins/io.github.majkelll.omarchy-uptime
omarchy-shell shell rescanPlugins
omarchy plugin enable io.github.majkelll.omarchy-uptime right

Saving a file under ~/.config/omarchy/plugins/ reloads the plugin automatically.

The parsing, scheduling, and outage state machine live in Model.js, free of Qt, so they run under Node:

node tests/model.test.js

.github/workflows/tests.yml runs those on every push, plus the check script against a local HTTP server so its verdicts — 200, 404, an expected status, a refused connection — are exercised for real.

File What
Service.qml the schedule, the checks, the history, the notifications
BarWidget.qml the bar icon
Panel.qml the popup
Model.js every decision the plugin makes, as pure functions
scripts/omarchy-uptime-check probes targets in parallel with curl

License

MIT. See LICENSE.