Releases: Rabbit-Company/UptimeMonitor-Server
v0.3.1
v0.3.0
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 isNow, 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 childrenWhy?
- Multiple parents - a monitor or group can now appear in multiple parents'
childrenarrays, 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
childrenfield, replacing two separate fields (groupIdandparentId).
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 lineStep 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 lineStep 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
childrenreferences
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 = 0After (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 ofgroupId/parentId. - POST/PUT requests accept
children(array of strings) instead ofgroupId/parentId. - DELETE cleanup now removes the deleted ID from
childrenarrays across all monitors and groups, instead of clearinggroupId/parentIdfields.
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 -> childedges. - The example configuration uses
childrenarrays.
Other Notes
dependenciesis unchanged - it continues to work exactly as before for notification suppression.strategyanddegradedThresholdremain group-only fields. Monitors withchildrendo 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
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
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.tomlfile.
v0.2.19
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
groupIdfrom monitors, its ID from status page items, and itsparentIdfrom child groups. Same applies to monitors, notification channels, and pulse monitors. - Partial updates -
PUTendpoints accept only the fields you want to change. Set a field tonullto 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
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
Update:
- Implement Telegram notification provider
v0.2.16
Update:
- Implement
/openapi.jsonAPI endpoint - Update dependencies
v0.2.15
Update:
- Implement password protected status pages
v0.2.14
Update:
- Add support for Ntfy notification provider