self-hosted · MIT · websites, servers and OpenWrt routers

See what your network is really doing.Measured, never guessed.

Websites, servers and OpenWrt routers in one self-hosted dashboard. Agents report out over HTTPS, so no monitored machine needs an open port, and a value nobody measured stays a dash, never a made-up zero.

Live from bloodkings.eu

The project's own instance, through our Cloudflare Worker

Loading

Waiting for the first answer…

Monitors
—
Nodes online
—
Avg response · 1 h
—
Uptime · 30 days
—
Last check
—
Latest server release
—

Polled every minute; the worker caches answers for up to 5 minutes.

OpenWrt · Turris OS

Your router, measured from the inside.

One POSIX shell script, started by cron every minute. No resident daemon, no bash, no Python. It reads what the router already knows through ubus, /proc and /sys and sends it out over HTTPS.

  • The LAN switch, port by port

    Which sockets carry a link, at what negotiated speed, what each port and the device on the other end could do, and how many devices the bridge has learnt behind each one.

  • WAN against the line you pay for

    Enter the speed in your contract and the dashboard compares it with what the WAN link and the router’s own ports can carry, so a slow line and a router bottleneck look different.

  • Wi-Fi radios, without scanning

    Band, channel width, clients and signal per radio, and how busy the channel is from counters the driver already keeps. No scan of the air around you is started.

  • An LTE backup you can check

    With a Huawei HiLink modem as the backup line, the agent reads its signal (RSRP, SINR, RSSI) and registration, so you know it works before you need it.

  • Disks with SMART

    Router disks are read with smartctl at most once an hour, so a sleeping disk is not woken every minute.

  • Remote actions: opt-in and signed

    Six actions (restart WAN, WireGuard or a service, reconnect PPPoE, renew DHCP, reboot) run only when enabled in the router’s own config, only with a valid HMAC signature, and never twice for one request.

Data flow of the OpenWrt agent (illustration, not live data)Your routercron · every minuteWANLANWi-Fi radiosLTE backupdiskStays on the routerMACs · hostnames · device IPsHTTPS POST, outbound onlyYour serverPHP + MySQL
Data flow of the OpenWrt agent (illustration, not live data)

MAC addresses never leave the router

Per-port device counts are sent, not identifiers. Hostnames and device IPs stay on the box too, unless you opt in to a named device list.

What a run costs

process forks per warm run
182

Agent 0.1.9 in the project’s busybox e2e harness, not on a physical router. On your router the agent reports the CPU time of its previous run, so the dashboard shows the real cost.How it is measured

What it watches

One dashboard for the things that break at home and at work.

Each card says how far it is built. “Partial” and “Planned” mean exactly that.

All features
  • Available

    Websites & certificates

    HTTP(S) checks with an optional keyword in the page, TLS certificate expiry and TCP port checks. Minecraft, TeamSpeak and Discord servers too.

  • Available

    Servers

    Agents for Linux (Bash or Python), Windows (PowerShell) and Docker: CPU, memory, disks and network, plus SMART on Linux.

  • Available

    OpenWrt & Turris routers

    Switch ports, WAN, Wi-Fi radios, LTE backup, SMART disks and opt-in signed remote actions, from one shell script.

  • Available

    Heartbeats & watchdog

    Cron jobs and backups report in on their own. A Cloudflare Worker outside your server notices when the collector itself stops.

  • Available

    Status pages & incidents

    A public status page with incidents, planned maintenance, e-mail subscribers, SVG badges and an RSS feed.

  • Available

    Alerts & integrations

    E-mail, SMS (Twilio), WhatsApp (CallMeBot), Discord, Slack, Telegram, Pushover and PagerDuty, and a Prometheus exporter.

  • Available

    Accounts

    Two-factor sign-in (TOTP), OAuth with GitHub, Google, Discord or GitLab, and two roles: admin and user.

  • Partial

    Checks from more than one place

    Checks run from your server. Add your own probe nodes (a PHP script for another host, or a Cloudflare Worker for websites) to confirm from elsewhere.

  • Planned

    Mobile app

    No native app yet. The dashboard at /app works in a phone browser.

Live proof

This page is watched by the product it describes.

Both panels below talk to our Cloudflare Worker right now. When a request fails you see a dash or an error, never a stand-in number.

Agents reporting right now

The nodes the public status API of bloodkings.eu returns.

— nodes
  • Loading live data…

Send one real request from our Cloudflare Worker

Enter a public http(s) address. The worker requests it once and returns the HTTP status and the total round trip it measured. Redirects are reported, not followed; private and local addresses are refused.

No request sent yet. Nothing below is filled in until the worker answers.

Target
—
HTTP status
—
Round trip
—
Measured at
—

Only the total time until the response arrived is measured, from wherever the worker runs at that moment. A worker cannot time DNS, TCP and TLS separately, so no such breakdown is shown.

How it works

From a PHP host to your first alert.

  1. Put the server on a PHP host

    PHP 8.2+ (the project’s CI runs 8.4) with MySQL or MariaDB, and cron running cron.php every minute. Shared hosting is enough; the server needs no container. The release ZIP carries the built /app dashboard, so only a build from source needs Node.js.

    1. Download

      bloodkings-monitoring.zip from the latest release. Upload status/ and app/ to your hosting.

    2. Empty database

      Create a database and its user in your hosting panel. Nothing to import.

    3. Installer

      Open /app/setup: it writes config.php, creates the tables and the first account.

    4. Cron every minute

      Add the line the installer shows. It turns green at the first run.

    Measured install time: 1 min (from the release ZIP to the first collector run on a clean PHP 8.2 and MySQL server, following this guide; uploading over FTP and clicking through your hosting panel come on top)

    All seven steps on the download page →
  2. Register an agent

    Add the machine in your app (Infrastructure → Add New Monitor) and run the commands it prints with your address and key, or register many machines with one token. The agent sends its report out over HTTPS; nothing on the machine listens for connections.

  3. Get alerted and publish status

    Connect the alert channels you use (Discord, Slack and Telegram can also be set per monitor), then share the public status page with incidents and maintenance notes.

Read the full setup guide

Install an agent

Pick a platform, read the script, run the commands.

Replace https://YOUR-DOMAIN with the address of your own server and YOUR_AGENT_KEY with the key of the monitor. Your app prints the same commands with both filled in.

Easiest from your own app: Infrastructure → Add New Monitor → OpenWrt Router or VPS Agent, then save. The dialog prints these steps with your address and the monitor’s key filled in. Below, https://YOUR-DOMAIN and YOUR_AGENT_KEY stand in for them.

A Bash agent. It reads the server address and its key from agent.cfg next to the script and reports over HTTPS; cron runs it every 5 minutes.

Latest version
—
Needs
Bash, cron and wget; curl for registration with a token. Root for /opt.
Read the script first
agent.sh

Install

  1. Download the agent

    mkdir -p /opt/bk-agent && wget -O /opt/bk-agent/agent.sh https://YOUR-DOMAIN/status/agent.sh && chmod +x /opt/bk-agent/agent.sh
  2. Create the config with the server address and key

    cat > /opt/bk-agent/agent.cfg <<'EOF'
    API_URL="https://YOUR-DOMAIN/status/agent_api.php"
    AGENT_KEY="YOUR_AGENT_KEY"
    AUTO_UPDATE="1"
    EOF

    The file must sit in the same folder as the script.

  3. Run the agent by hand and check its output

    /opt/bk-agent/agent.sh --verbose
  4. Add the agent to cron, every five minutes

    ( crontab -l 2>/dev/null || true; echo '*/5 * * * * /opt/bk-agent/agent.sh >/dev/null 2>&1' ) | crontab -
Uninstall
( crontab -l 2>/dev/null | grep -v /opt/bk-agent/agent.sh || true ) | crontab -
rm -rf /opt/bk-agent

Then delete the agent’s monitor in the dashboard so its key stops working.

Registering many machines with one token, and what to check when an agent does not show up: on the download page →

Honest scope

What it doesn’t do (yet)

  • No ICMP ping and no UDP checks. The “port” check is a TCP connect.
  • No shared probe network. Checks run from your server unless you add your own probe nodes.
  • No SNMP. A device without an agent is watched from outside only (HTTP, TCP).
  • No native mobile app yet; it is on the roadmap.
  • Two roles only: admin and user.
  • The legacy PHP admin (admin.php) is mostly Czech; the /app dashboard speaks English and Czech.
  • The router agent needs cron and ubus, so it runs on OpenWrt and Turris OS, not on vendor firmware.
See the roadmap

FAQ

Questions people ask first

Is it free?

Yes. It is MIT-licensed, there is no paid tier and no account with us. You run it on your own host.

What does the server need?

A web host with PHP 8.2 or newer, MySQL or MariaDB, and cron to run cron.php every minute. Shared hosting works; the server needs no Docker. The release ZIP already carries the built /app dashboard; only a build from source needs Node.js.

Does my router need an open port?

No. Agents only make outbound HTTPS requests to your server. Remote actions, if you enable them, arrive in the answer to the agent’s own request.

How heavy is the OpenWrt agent?

It is started by cron once a minute and exits; nothing stays resident. In the project’s busybox test harness agent 0.1.9 makes about 182 forks per warm run. On your router it reports the CPU time of its previous run, so you see the real cost.

Where does my data go?

Only to the server you point the agents at. MAC addresses, hostnames and device IPs stay on the router; per-port counts are sent instead, unless you opt in to a named device list. This website loads nothing from third parties.

Why do some values show a dash?

A dash means nobody measured it: the sensor or package is missing, the first sample is still warming up, or the data is stale. A zero would be a measurement, so the app never prints one it did not take.

Does it run on Turris OS?

Yes. The router agent is developed against a Turris Omnia, and the installer adds its cron line through crontab, which Turris OS (cronie) honours.

Can I use it without routers?

Yes. Website, TCP port and heartbeat checks need no agent at all, and there are agents for Linux, Windows and Docker.

Why it exists

Built for one home network first.

It started with a Turris Omnia at home: the WAN on an SFP module, an LTE modem as the backup line and an mSATA disk. A plain uptime check could say whether the house was online, but not why it was slow or whether the backup would work.

So the agent learnt to read the router itself, and one rule stuck: if it was not measured, show a dash. The same rule runs through the dashboard, the status page and this website.

InstallMore about the project