| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
| |
go-libsql includes pre-compiled Rust libraries built against glibc.
Alpine uses musl libc which is incompatible (undefined mmap64, fstat64).
|
| |
|
|
|
|
|
|
|
|
|
| |
New refresh_mode 'stream' eliminates blocking database queries from initial
page load. Page renders instantly with skeleton UI, then hydrates via SSE.
- Add SSE hub for managing client connections and broadcasting
- Add /api/stream endpoint with init and update events
- Add stream.html skeleton template with loading animations
- Wire scheduler to broadcast on check completion
- Backwards compatible: page/api modes unchanged
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
- Include raw timestamp in tooltip data for browser timezone conversion
- Add timestampLabel field to identify which row contains the date
- JavaScript converts build date to browser timezone when timezone: Browser
- Falls back to configured timezone for server-side rendering
|
| |
|
|
|
|
|
| |
- Add VersionInfo struct to server
- Add SetVersion() method called from main.go
- Display version, commit, and build date in hoverable tooltip
- Tooltip uses same style as other tooltips in the UI
|
| |
|
|
|
|
|
| |
- Add /api/reload endpoint that triggers configuration reload
- Always requires API key authentication (even if api.access is public)
- Returns error if no API keys are configured
- Update config.example.yaml with new endpoint and {group}/{name} format docs
|
| | |
|
| | |
|
| |
|
|
|
| |
- Delete Makefile (switching fully to justfile)
- Add coverage.out, coverage.html, and dist/ to clean target
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previously monitors were identified by just their name, causing monitors
with the same name in different groups to share data in the database.
Changes:
- Add ID() method to MonitorConfig returning 'group/name' format
- Add Group field to MonitorConfig (set at runtime)
- Update Monitor interface with ID() and Group() methods
- Update all monitor implementations (http, tcp, dns, icmp, gemini,
graphql, database) to use composite ID
- Update Scheduler to use monitor ID instead of name
- Update server handlers to use composite ID for stats lookups
- Change API routes to use {group}/{name} pattern:
- /api/monitor/{group}/{name}
- /api/history/{group}/{name}
- /api/uptime/{group}/{name}
- /api/badge/{group}/{name}.svg
- URL-encode group and name components to handle special characters
(e.g., slashes in names become %2F)
- Update config.UpdateResetFlag to accept group and name separately
BREAKING: API endpoints now require group in the path. Existing database
data using just monitor names won't be associated with the new composite
keys.
|
| |
|
|
|
| |
Go's ServeMux doesn't support wildcards with extensions like {name}.svg,
so use {name...} to capture the full path and strip .svg in the handler.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
GET /api/badge/{name}.svg - Shields.io style status badges (always public)
Options:
- ?label=Custom - Override the label text (default: monitor name)
- ?style=flat|plastic - Badge style (default: flat)
- ?type=status|uptime - Show status or uptime percentage (default: status)
Colors:
- Green (#22c55e) for up / >=99% uptime
- Yellow (#eab308) for degraded / >=95% uptime
- Red (#ef4444) for down / <95% uptime
- Gray (#9ca3af) for unknown
Example: 
|
| |
|
|
|
|
|
|
|
|
| |
New endpoints:
- GET /api/health - Simple health check, always public (for load balancers)
- GET /api/summary - Lightweight status overview (counts + overall status)
- GET /api/uptime/{name}?period=1h|24h|7d|30d|90d - Historical uptime stats
- GET /api/incidents?filter=all|active|resolved|scheduled - List incidents
All new endpoints (except /api/health) follow api.access rules.
|
| |
|
|
|
|
|
|
|
|
| |
Replace N+1 API calls (1 status + N history) with a single /api/page
endpoint that returns all monitor data including history ticks.
For 20 monitors: 21 requests -> 1 request per refresh interval.
The /api/page endpoint is automatically public when refresh_mode=api,
regardless of api.access setting, to ensure the page can always refresh.
|
| |
|
|
|
|
| |
Fetch /api/history/{name} for each monitor in parallel and rebuild
tick elements with proper colors and tooltips. Also add data attributes
to monitor elements for hide_ping and disable_tooltips settings.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Add display.refresh_mode option:
- 'page' (default): Full page refresh via meta refresh
- 'api': Fetch /api/status and update DOM without reload
Also add display.refresh_interval (default: 30s, min: 5s)
API mode updates: status indicators, response times, uptimes,
errors, overall status banner, and page title counts.
History bars remain static until full page refresh.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Add configurable access control for /api/* endpoints:
- public: Anyone can access (default, backwards compatible)
- private: API endpoints return 403 Forbidden
- authenticated: Requires API key via X-API-Key header or ?api_key= param
Config example:
api:
access: authenticated
keys:
- "secret-key-1"
- "secret-key-2"
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Support defaulting any monitor option at group level:
- expected_content, body (HTTP/HTTPS)
- ping_count (ICMP)
- dns_server, record_type (DNS)
- graphql_query, graphql_variables (GraphQL)
- db_type (Database)
Only name, type, target, link, reset_on_next_check, expected_ips,
and expected_cname remain monitor-specific (not defaultable).
|
| |
|
|
|
|
|
|
|
| |
Add support for setting these options at group level:
- hide_ssl_days, hide_ping, round_response_time, round_uptime
- method, user_agent, headers, expected_status
This allows configuring common settings once per group instead of
repeating them on every monitor.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
- Default to dark mode by setting class="dark" on html element
- Move theme CSS before external stylesheet to prevent flash
- Only remove dark class if light mode is explicitly preferred
- Add !important to theme variable overrides for precedence
|
| |
|
|
|
|
|
| |
Move theme detection script to the very top of <head>, before any
stylesheets load. This ensures the 'dark' class is added to <html>
before the browser starts rendering with CSS, eliminating the flash
of unstyled/wrong-theme content.
|