Skip to content

Releases: Rabbit-Company/UptimeMonitor-Server

v0.3.1

19 Feb 21:53

Choose a tag to compare

Update:

  • Harden ClickHouse aggregation job

v0.3.0

19 Feb 19:33

Choose a tag to compare

Top-Down Hierarchy with children

⚠️ Breaking Change

This release replaces the bottom-up groupId (on monitors) and parentId (on groups) fields with a unified top-down children array on both monitors and groups. Existing config.toml files must be manually migrated before upgrading.


What Changed

Previously, hierarchy was defined bottom-up - each entity pointed to its parent:

# OLD (v0.2.x)
[[monitors]]
id = "api-prod"
groupId = "production"    # monitor says who its parent is

[[groups]]
id = "production"
parentId = "all-services" # group says who its parent is

Now, hierarchy is defined top-down - each parent lists its children:

# NEW (v0.3.0)
[[groups]]
id = "all-services"
children = ["production", "staging"]  # parent lists its children

[[groups]]
id = "production"
children = ["api-prod", "web-prod"]   # parent lists its children

Why?

  • Multiple parents - a monitor or group can now appear in multiple parents' children arrays, enabling shared/overlapping groups without duplication.
  • Monitors can have children - monitors can now hold other monitors or groups beneath them, enabling richer hierarchy models.
  • Intuitive top-down definition - defining structure from parent to child is more natural and easier to reason about when reading a config file.
  • Unified model - both monitors and groups use the same children field, replacing two separate fields (groupId and parentId).

How to Upgrade

Step 1: Identify all groupId values on monitors

For every monitor that has a groupId, note the monitor ID and the group it belongs to:

# OLD
[[monitors]]
id = "api-prod"
groupId = "production"   # remove this line

Step 2: Identify all parentId values on groups

For every group that has a parentId, note the group ID and its parent:

# OLD
[[groups]]
id = "production"
parentId = "all-services" # remove this line

Step 3: Move relationships to children arrays on parents

Remove all groupId and parentId lines. Instead, add children arrays to the parent entities:

# NEW - the parent group lists its children
[[groups]]
id = "all-services"
children = ["production", "staging"]

[[groups]]
id = "production"
children = ["api-prod", "web-prod", "db-prod"]

Step 4: Verify

Start the server. Configuration validation will catch:

  • References to non-existent IDs in children
  • Self-references (an entity listing itself as a child)
  • Circular children references

Full Before/After Example

Click to expand full migration example

Before (v0.2.x):

[[monitors]]
id = "api-prod"
name = "Production API"
token = "tk_api"
interval = 30
maxRetries = 0
resendNotification = 0
groupId = "production"

[[monitors]]
id = "db-prod"
name = "Production Database"
token = "tk_db"
interval = 15
maxRetries = 1
resendNotification = 0
groupId = "infrastructure"

[[groups]]
id = "all-services"
name = "All Services"
strategy = "percentage"
degradedThreshold = 75
interval = 60
resendNotification = 0

[[groups]]
id = "production"
name = "Production"
parentId = "all-services"
strategy = "percentage"
degradedThreshold = 50
interval = 60
resendNotification = 0

[[groups]]
id = "infrastructure"
name = "Infrastructure"
parentId = "all-services"
strategy = "all-up"
degradedThreshold = 0
interval = 60
resendNotification = 0

After (v0.3.0):

[[monitors]]
id = "api-prod"
name = "Production API"
token = "tk_api"
interval = 30
maxRetries = 0
resendNotification = 0

[[monitors]]
id = "db-prod"
name = "Production Database"
token = "tk_db"
interval = 15
maxRetries = 1
resendNotification = 0

[[groups]]
id = "all-services"
name = "All Services"
strategy = "percentage"
degradedThreshold = 75
interval = 60
resendNotification = 0
children = ["production", "infrastructure"]

[[groups]]
id = "production"
name = "Production"
strategy = "percentage"
degradedThreshold = 50
interval = 60
resendNotification = 0
children = ["api-prod"]

[[groups]]
id = "infrastructure"
name = "Infrastructure"
strategy = "all-up"
degradedThreshold = 0
interval = 60
resendNotification = 0
children = ["db-prod"]

Admin API Changes

If you use the Admin API, request and response schemas have changed:

Resource Removed Fields Added Fields
Monitors groupId children
Groups parentId children
  • GET responses now return children: [...] instead of groupId/parentId.
  • POST/PUT requests accept children (array of strings) instead of groupId/parentId.
  • DELETE cleanup now removes the deleted ID from children arrays across all monitors and groups, instead of clearing groupId/parentId fields.

Visual Configuration Editor

The Visual Configuration Editor has been updated to match:

  • The Group dropdown on monitors and the Parent Group dropdown on groups have been replaced with a Children multi-select on both monitors and groups.
  • The topology graph now uses unified parent -> child edges.
  • The example configuration uses children arrays.

Other Notes

  • dependencies is unchanged - it continues to work exactly as before for notification suppression.
  • strategy and degradedThreshold remain group-only fields. Monitors with children do not calculate aggregate status - they always derive their own status from their pulses.
  • All existing monitor data, pulse history, and group history in ClickHouse is unaffected. Only the config file structure has changed.

v0.2.21

18 Feb 18:13

Choose a tag to compare

Webhook Notification Provider

A new Webhook notification provider is now available alongside Discord, Email, Ntfy, and Telegram. It sends a standardized JSON payload via POST to any URL of your choice, so you can integrate Uptime Monitor with any service or build your own alert handler.

Configuration

[notifications.channels.critical.webhook]
enabled = true
url = "https://example.com/webhook"

# Optional: headers for authentication
[notifications.channels.critical.webhook.headers]
Authorization = "Bearer your-token"

Payload

Every notification is sent as a POST with Content-Type: application/json and a fixed structure:

{
  "type": "down",
  "monitorId": "api-prod",
  "monitorName": "Production API",
  "sourceType": "monitor",
  "timestamp": "2025-01-15T10:30:00.000Z",
  "formattedTime": "2025-01-15 10:30:00",
  "interval": 60,
  "downtime": 120000,
  "downtimeDuration": "2m 0s",
  "consecutiveDownCount": 2
}

Group notifications include an additional groupInfo object with strategy, children status, and uptime percentage.

The webhook provider is fully supported across TOML configuration, hot-reload, and the Admin API.

v0.2.20

15 Feb 12:50

Choose a tag to compare

Added:

  • Support for monitoring Minecraft Java and Minecraft Bedrock services thru PulseMonitor

Updated:

  • Prevent storing custom values from pulses when custom fields are disabled in config.toml file.

v0.2.19

14 Feb 11:16

Choose a tag to compare

Admin API

This release introduces the Admin API. A full set of REST endpoints for managing your Uptime Monitor configuration programmatically. Create, read, update, and delete monitors, groups, status pages, notification channels, and pulse monitors without manually editing config.toml.

Getting Started

Add this to your config.toml to enable the Admin API:

[adminAPI]
enabled = true
token = "your-secure-admin-token-here"

All endpoints are authenticated via Authorization: Bearer <token>.

Endpoints

Resource List / Create Get / Update / Delete
Configuration GET /v1/admin/config -
Monitors GET/POST /v1/admin/monitors GET/PUT/DELETE /v1/admin/monitors/:id
Groups GET/POST /v1/admin/groups GET/PUT/DELETE /v1/admin/groups/:id
Status Pages GET/POST /v1/admin/status-pages GET/PUT/DELETE /v1/admin/status-pages/:id
Notification Channels GET/POST /v1/admin/notifications GET/PUT/DELETE /v1/admin/notifications/:id
Pulse Monitors GET/POST /v1/admin/pulse-monitors GET/PUT/DELETE /v1/admin/pulse-monitors/:id

Highlights

  • Safe for production - all inputs are validated before writing. If a config reload fails after write, the previous configuration is automatically restored.
  • Automatic reference cleanup - deleting a group removes its groupId from monitors, its ID from status page items, and its parentId from child groups. Same applies to monitors, notification channels, and pulse monitors.
  • Partial updates - PUT endpoints accept only the fields you want to change. Set a field to null to remove optional values.
  • Conflict detection - duplicate IDs, tokens, and slugs are rejected with 409 Conflict.
  • OpenAPI spec updated - all admin endpoints are fully documented in /openapi.json

Example: Create a Monitor

curl -X POST http://localhost:3000/v1/admin/monitors \
  -H "Authorization: Bearer your-secure-admin-token-here" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "api-staging",
    "name": "Staging API",
    "token": "tk_staging_api_secret",
    "interval": 30,
    "maxRetries": 2,
    "resendNotification": 0,
    "groupId": "staging",
    "notificationChannels": ["critical"]
  }'

Documentation

v0.2.18

12 Feb 18:53
4a582ac

Choose a tag to compare

Dependencies (notification suppression)

We have added Dependencies support to help prevent alert storms when an upstream component fails.

You can now set an optional dependencies array on monitors and groups.

Before sending a notification (down, still-down, recovered), the system checks whether any dependency is currently down.

If a dependency is down, the notification is suppressed, so you only get alerted for the highest-level/root-cause outage.

Status tracking is unchanged (uptime, group health, status pages still work normally). Only notifications are suppressed.

v0.2.17

08 Feb 18:51

Choose a tag to compare

Update:

  • Implement Telegram notification provider

v0.2.16

08 Feb 08:56

Choose a tag to compare

Update:

  • Implement /openapi.json API endpoint
  • Update dependencies

v0.2.15

01 Feb 17:52

Choose a tag to compare

Update:

  • Implement password protected status pages

v0.2.14

30 Jan 21:31

Choose a tag to compare

Update:

  • Add support for Ntfy notification provider