Commit Graph
100 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 4.6 d96d923054 Fix server npm ci: add native build tools for better-sqlite3
Docker Build and Push / build (push) Failing after 3m39s
better-sqlite3 requires python3/make/g++ to compile on Alpine.
Also switches deprecated --only=production to --omit=dev.
Build tools are removed after install to keep image size down.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-26 14:54:01 -04:00
nmemmertandClaude Sonnet 4.6 e7efe3c80d Fix npm ci failure for react-scripts 5 + React 19 peer deps
Docker Build and Push / build (push) Failing after 3m3s
react-scripts@5.0.1 declares peer deps against React 17/18; adding
--legacy-peer-deps lets npm ci succeed without changing the lockfile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-26 14:48:18 -04:00
nmemmertandClaude Sonnet 4.6 a0af4e7435 Add Gitea Actions workflow for Docker build and push
Docker Build and Push / build (push) Failing after 2m22s
Moves .github/workflows to .gitea/workflows, updates registry to
git.necloud.us, switches secrets to REGISTRY_USER/REGISTRY_TOKEN,
and replaces github. context refs with gitea. equivalents.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-26 13:30:52 -04:00
nmemmertandClaude Sonnet 4.6 ce4bea5e29 Add agent command execution (terminal panel)
- DB: new agent_commands table (id, agent_id, command, status, output, exit_code, timestamps)
- Server: 4 new routes
    POST /api/agents/:id/commands        queue a command (dashboard → agent)
    GET  /api/agents/:id/commands        history (last 50) for dashboard
    GET  /api/agents/commands/pending    agent dequeues + marks running (Bearer auth)
    POST /api/agents/commands/:id/result agent posts output/exit_code (Bearer auth)
  Output capped at 128 KB; Bearer token enforced on agent-facing routes
- Agents (Linux/macOS/Windows): each polls /commands/pending each cycle,
  executes via bash/PowerShell with 60s timeout, posts result back
- UI: ">_" button on each AgentCard opens CommandTerminal panel
    Input line, Run button, history list (status icon + command + time)
    Click any entry with output to expand/collapse its output
    Auto-refreshes every 4 s while open

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-11 17:05:20 -04:00
nmemmertandClaude Sonnet 4.6 13b3e3612b Add macOS and Windows agents + multi-platform install UI
- agent/skywatch-agent-macos.sh: Full macOS bash agent (launchd)
  - CPU via top -l 2, memory via vm_stat/sysctl, disk via df -P
  - Network via netstat -ib, uptime via kern.boottime, OS via sw_vers
- agent/install-agent-macos.sh: Installs macOS agent as launchd daemon
- agent/skywatch-agent-windows.ps1: PowerShell agent (Task Scheduler)
  - CPU via Win32_PerfRawData two-sample delta, memory via Win32_OperatingSystem
  - Disk via Get-PSDrive, network via Get-NetAdapterStatistics
- agent/install-agent-windows.ps1: Installs Windows agent via Task Scheduler
- server/index.js: New routes for macOS and Windows agent scripts/installers
- client/src/Agents.js: Multi-platform install panel with Linux/macOS/Windows tabs
- client/src/Agents.css: Platform tab button styles

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-11 16:54:50 -04:00
nmemmertandClaude Sonnet 4.6 784e539af3 Fix update script: remove server-side client build
Server can't handle the React build. Client is built locally and
committed to git; update-server.sh just pulls and restarts PM2.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-11 15:09:48 -04:00
nmemmertandClaude Sonnet 4.6 65e97f2dae Add agent notifications + fix update script
- scheduler.js: check agents every 2 min — alert on offline/online
  transitions and CPU/memory/disk threshold breaches (90%)
- notificationService.js: sendAgentAlert() sends via email, webhook,
  ntfy, and saves to in-app notifications table
- package.json: pin better-sqlite3 to 9.6.0 (compatible with Node 20)
- update-server.sh: add React client build step; use npm install
  instead of rm -rf + npm ci for faster incremental updates

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-11 14:42:24 -04:00
nmemmertandClaude Sonnet 4.6 020a8a8ea7 Add Agents UI page + installer script endpoint
- client/src/Agents.js: page showing registered Linux agents with live
  status, CPU/memory/disk gauge bars, load/uptime/network stats, and
  an install-instructions panel with copyable curl commands
- client/src/Agents.css: dark-theme card grid styles matching the app
- client/src/App.js: adds /agents route and Agents nav link
- server/index.js: adds GET /api/agents/installer to serve install-agent.sh
- client/build: production build updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-11 10:05:24 -04:00
nmemmertandClaude Sonnet 4.6 06e8e64a0b Add Linux agent: metrics collection + server API + installer
- agent/skywatch-agent.sh: bash daemon that collects CPU, memory, disk,
  network, load, and uptime, then POSTs to /api/agents/report every 60 s
- agent/install-agent.sh: systemd installer; registers agent on first run
- server/database.js: adds `agents` and `agent_metrics` tables with indexes
- server/index.js: adds agent API routes (register, report, list, history,
  delete, script/installer download); optional AGENT_REGISTRATION_KEY guard

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-11 10:01:45 -04:00
nmemmertandClaude Sonnet 4.6 0f93d16874 Add build-tool install step to update script
Ensures gcc/g++/python3 are present before npm install so
better-sqlite3 can compile its native binding on a fresh Ubuntu server.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 18:19:20 -04:00
nmemmertandClaude Sonnet 4.6 f119168399 Full health check: fix startup crash, add subnet input to network discovery
Server fixes:
- database.js: auto-create data/ directory on startup — was crashing on
  fresh clone because the gitignored directory didn't exist
- better-sqlite3 upgraded to latest (13.x) for Node 26 compatibility

Network discovery:
- discoverNetwork() accepts optional subnet param; scans that range instead
  of auto-detecting when provided
- New GET /api/network-subnets endpoint returns detected local interfaces
  so UI can offer quick-select buttons
- Discovery modal: subnet text input + Scan button + auto-detect quick-select;
  local subnet buttons populate once the modal is open
- server/index.js: pass subnet from request body to discoverNetwork()

Infra:
- React client runs on PORT=3456 in dev to avoid port conflicts
- .claude/launch.json added for one-command preview via Express (serves
  the pre-built client, no port conflict with the preview tool)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 17:21:34 -04:00
nmemmertandClaude Sonnet 4.6 59078362da Fix per-resource settings: tags saving, is_public bug, global setting inheritance
Bug fixes:
- tags field was missing from INSERT/UPDATE SQL — tags never persisted
- is_public: `0 !== false` is true in JS, so private resources (is_public=0)
  were silently flipped to public on every edit; fixed with explicit 0/false check

Global setting inheritance:
- One-time DB migration nulls out check_interval and timeout on all existing
  resources so they inherit from global monitoring settings going forward
- Scheduler reads global check_interval and timeout from DB each cycle and
  uses them as the fallback when per-resource values are null
- Create and edit modals: empty field = use global; placeholder shows the
  current global value so it's clear what will be used

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 17:01:03 -04:00
nmemmertandClaude Sonnet 4.6 3a3d32ecac Add slow_alert_consecutive setting to control slow alert sensitivity
Exposes the consecutive-slow-checks requirement as a configurable setting
instead of hardcoding 3. Saved under key 'slow_alert_consecutive' in the
DB, readable via SLOW_ALERT_CONSECUTIVE env var. UI appears in Settings →
Monitoring alongside the existing Consecutive Failures Threshold field.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 16:53:06 -04:00
nmemmertandClaude Sonnet 4.6 dd85a79d55 Fix false-positive slow alerts: require 3 consecutive checks + use P95 baseline
Previously a single check above 2× average response time fired an alert.
This caused false positives from normal network variance.

- scheduler.js: track consecutive slow checks per resource; only alert after
  3 in a row (resets to 0 when response time normalises)
- monitorService.js: calculateResponseTimeBaseline now returns P95 instead
  of mean, making 2× baseline a much more realistic slow threshold

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 16:50:57 -04:00
nmemmertandClaude Sonnet 4.6 98e0949d08 Fix timezone consistency: apply server timezone everywhere in the app
- Extract getServerTimezone() helper in timeUtils.js; apply it in
  formatChartTime and formatLocalTimeOnly (previously ignored TZ)
- Status.js: remove local formatLocalTime (was bare toLocaleString),
  import the shared util that reads server timezone
- SettingsWizard: immediately update localStorage when timezone is saved
  so new value takes effect without waiting for cache to expire

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 16:48:12 -04:00
nmemmertandClaude Sonnet 4.6 5e98e9aa05 Fix settings: only persist keys present in the request body
The POST /api/settings handler previously wrote ALL settings on every
save — so saving just the Email section would overwrite timezone,
check interval, ntfy topic, etc. with defaults.

Now:
- DB: only UPSERT the keys that are in this specific request body
- process.env: only update env vars for the keys in this request
- .env file: read → patch touched keys → write (not a full rewrite)

Section-scoped saves from the UI no longer clobber unrelated settings.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 16:40:29 -04:00
nmemmertandClaude Sonnet 4.6 279cba5115 Fix ntfy: use JSON body instead of headers to support emoji titles
Sending emoji in HTTP headers is not valid ASCII and causes errors.
Switching to ntfy's JSON body API (POST to /topic with {topic, title,
message, priority, tags}) allows full UTF-8 including emoji.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 16:31:44 -04:00
nmemmertandClaude Sonnet 4.6 d46a37a219 Fix ntfy: URL-encode Title header to avoid non-ASCII rejection
HTTP headers must be ASCII-only. Emoji in the Title header caused
"Invalid character in header content" errors. ntfy.sh accepts
URL-encoded header values, so encodeURIComponent() fixes it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 16:26:31 -04:00
nmemmertandClaude Sonnet 4.6 8d50d3cb61 Fix bugs, UX rough edges, add ntfy.sh + network discovery
Bugs fixed:
- Status page: autoRefresh checkbox now actually pauses the interval
- Dashboard edit modal: hide URL field for heartbeat resources (was always shown as required)
- Dashboard: apply items_per_page, default_sort, and refresh_interval from settings on mount
- Dashboard: call loadResources() immediately on mount (was waiting 15s for fallback)
- Observability: listen for WS 'metrics' messages so tab updates live, not just on poll

UX improvements:
- Dashboard: replaced window.confirm() with inline Confirm/Cancel buttons for single and bulk delete
- Dashboard: skeleton rows shown while initial data loads (no more flash of empty state)
- Notifications: WebSocket moved from window global to useRef; exponential backoff on reconnect
- Notifications: replaced window.confirm() with inline Confirm/Cancel for Clear All
- ResourceDetail: initial API calls run in parallel via Promise.all

New features:
- ntfy.sh push notification channel: enable in Settings, enter topic, get mobile push alerts
- Network Discovery: Actions → Discover Network scans LAN for reachable hosts, probes HTTP ports, and lets you add any found host to monitoring in one click

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 13:24:47 -04:00
nmemmertandClaude Sonnet 4.6 de4619992e Fix dark mode: purge stale theme=light from DB on startup
The previous fix changed code defaults to dark but the DB still had
theme='light' stored explicitly — a truthy value that bypassed all
fallbacks. On every restart the server was returning theme:'light',
which the client applied via data-theme="light", making the app white.

- Delete the 'theme' key from DB on startup (one-time migration)
- Always return theme:'dark' from buildSettingsFromDb (not from DB)
- Stop writing theme to DB/env/process.env on settings save

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-06 13:04:52 -04:00
nmemmertandClaude Sonnet 4.6 50f4f73af1 Fix white screen caused by theme defaulting to 'light'
The app is a dark-mode design but all theme defaults were 'light'.
Once the theme setting was wired to data-theme, it applied light mode
overrides that turned the app background white while panels stayed dark.

- Changed all server-side theme defaults from 'light' to 'dark'
- Added data-theme="dark" to index.html so the correct theme applies
  before React loads (eliminates any white flash on first render)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-31 11:09:19 -04:00
nmemmertandClaude Sonnet 4.6 a8fca2d1a1 Fix: SQLite integer 0 rendering as text, NaN avg response display
- maintenance_mode and hasActiveIncident are SQLite integers (0/1), not JS booleans.
  {0 && <span>} evaluates to {0} which React renders as the text "0" in the DOM.
  Fixed with !! coercion on both conditions in renderResourceRow.

- avgResponseTime can be NaN for resources with no checks (e.g. icmp with no data).
  Added || 0 guard in the aggregate average and —/ms conditional in the row display.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-31 11:06:23 -04:00
nmemmertandClaude Sonnet 4.6 b83a19e9cf Add 10 UX/feature improvements across dashboard, status page, and API
- Incident acknowledge: Ack button in dashboard rail and ResourceDetail incidents table
- Status page 90-day uptime history bars (teal ≥99%, amber ≥95%, red <95%, grey = no data)
- Theme setting applied: data-theme attribute wired to saved setting with CSS variables + light mode overrides
- Sparkline replaced with colored status bars (teal=up, red=down, grey=unknown) per check tick
- ResourceDetail chart time-range selector: 1h / 6h / 24h / 7d toggle fetches from checks endpoint
- Bulk actions: checkbox per row, select-all header, bulk delete and maintenance toggle bar
- CSV export adds 6 new fields (http_method, http_body, heartbeat_timeout, is_public, consecutive_failures_threshold, response_time_threshold)
- CSV import handles those 6 new fields on INSERT
- Check detail expansion: click expandable rows in Recent Checks to show full details JSON
- Browser push notifications: request permission opt-in, new Notification() on WS message when tab unfocused

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-31 11:01:24 -04:00
nmemmertandClaude Sonnet 4.6 5cfea703fb Fix notification panel readability — dark theme styling
Replace hard-coded white/light colors with dark theme palette matching the rest
of the app. Key changes: dark navy background (#1e293b/#0f172a), high-contrast
text (#f1f5f9 titles, #94a3b8 body), teal accent (#14b8a6) for active filter and
unread left-border, red (#f87171) clear button, dark scrollbar, subtle hover
states on items and action buttons.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-31 10:26:09 -04:00
nmemmertandClaude Sonnet 4.6 4fea0a95f5 Add HTTP method/body, alert escalation, baseline alerts, notification grouping, rate limiting, App.js split, and API tests
- HTTP method + request body: GET/POST/PUT/PATCH/DELETE/HEAD selector and body textarea for http/health checks; stored in http_method/http_body columns; monitorService sends correct axios method+data
- Alert escalation: incidents open longer than escalation_hours get forwarded to fallback_webhook and marked escalated=1; hourly cron in scheduler
- Baseline-relative slow alerts: effectiveThreshold = response_time_threshold || (baseline * 2) — adaptive threshold without manual config
- Notification grouping: pendingAlerts collected per check cycle; ≥2 alerts flush as one grouped email+webhook; individual in-app entries still saved per resource
- Rate limiting: in-memory per-IP limiter (20/min heartbeat, 60/min status-page); no external package
- App.js split: Dashboard.js (monitors list + modals) and ResourceDetail.js extracted; App.js reduced from ~1987 to ~80 lines
- formatDuration moved to utils/timeUtils.js; imported by both new components
- DB migrations: http_method, http_body, incidents.escalated columns
- 18 passing API/unit tests (node:test, zero dependencies)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-31 09:37:31 -04:00
nmemmertandClaude Sonnet 4.6 a6cf6a9762 Add heartbeat monitoring, alert rules, cert badges, webhook templates, and status page visibility
- Heartbeat type: cron jobs POST to /api/heartbeat/:token to stay alive; scheduler marks
  them down if no ping is received within the configured timeout window
- Alert rules: per-resource consecutive_failures_threshold now respected in handleIncident,
  overriding the global setting; GET /api/resources/:id/alert-rules endpoint added
- SSL cert expiry badge: dashboard rows surface days_remaining for TLS monitors, turning
  orange at ≤30 days and red at ≤7 days
- Webhook payload templates: {{name}}/{{status}}/{{url}}/{{type}}/{{message}}/{{timestamp}}
  variables interpolated before POST; Slack-compatible text wrapping as fallback
- Status page visibility: is_public column per resource; GET /api/status-page returns only
  public resources; Status.js updated to use the new endpoint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-31 09:08:15 -04:00
nmemmert 7968c9231e Feature: integrate app icon in UI and email alerts 2025-12-16 14:36:42 -05:00
nmemmert 51bc5ea6be Fix: Status page not displaying data - fix /api/resources response format 2025-12-16 13:50:20 -05:00
nmemmert 5ff9fd6c99 Chore: Remove debug console.log statements from server and client code 2025-12-16 13:46:55 -05:00
nmemmert 400953dfd7 Feature: Add public status page at /status showing incidents, maintenance, and system health 2025-12-16 13:44:02 -05:00
nmemmert 9dae22d696 Feature: Add incident editing modal for updating descriptions - PATCH /api/incidents/:id endpoint 2025-12-16 13:40:42 -05:00
nmemmert 03147ef772 Feature: Display incident descriptions in incidents timeline with expandable view 2025-12-16 13:38:29 -05:00
nmemmert 6a291e120d Feature: Independent settings section saving - no password re-entry required
- Refactored SettingsWizard to allow saving each section separately (Email, Webhook, Monitoring)
- Each section now has its own Save button
- Removed global Save button - sections save independently
- No longer need to re-enter email passwords when changing other settings
- Added success/error status messages that appear for 3-5 seconds
- Status messages appear as toast notifications in top-right corner
- Updated CSS with save-status styling and slideIn animation
- handleSaveSection() only POSTs the relevant fields for that section
2025-12-16 13:27:53 -05:00
nmemmert 5330c8932f Feature: Auto-create incidents after 10 failed checks with rich descriptions
- Add description and failed_check_count fields to incidents table
- Update handleIncident() to use configurable threshold (default 10 checks)
- Auto-generate incident description with:
  - Number of consecutive failures
  - Last error message/reason
  - First failure timestamp
- Add API endpoints: GET/POST /api/settings/incident-threshold
- Add UI settings field to configure incident failure threshold
- Server: Get threshold from database settings (persistent across restarts)
- Default threshold: 10 consecutive failed checks per resource
2025-12-16 13:24:20 -05:00
nmemmert 6b00530a89 Fix: Change email input type from email to text to support comma-separated addresses
- Allows users to enter multiple email addresses separated by commas
- Updated both Add Resource and Edit Resource forms
- Improved placeholder text to show example of comma-separated format
2025-12-16 13:08:40 -05:00
nmemmert 02a71f980a Feature: Multi-email alerts and move resource between groups
- notificationService.js: Parse comma-separated emails from resource.email_to or global config; validate and send to each recipient
- index.js: Add PATCH /api/resources/:id/group endpoint to move resource between groups with validation and cache invalidation
- App.js: Add group selector to edit modal; wire group change to PATCH endpoint; add help text for multi-email format (comma-separated)
2025-12-16 13:03:59 -05:00
nmemmert 923c36e494 Feature: Multi-email alerts and move resource between groups
- notificationService: Parse comma-separated emails from resource.email_to or global config; validate and send to each recipient
- API: Add PATCH /api/resources/:id/group endpoint to move resource between groups with validation and cache invalidation
- UI: Add group selector to edit modal; wire group change to PATCH endpoint; add help text for multi-email format
2025-12-16 13:01:37 -05:00
nmemmert 9c1c972045 Scheduler: stagger resource checks with spacing and jitter; rebuild client 2025-12-16 12:31:30 -05:00
nmemmert 803c5adbc2 Scheduler: stagger resource checks with spacing and jitter to avoid thundering herd 2025-12-16 12:31:03 -05:00
nmemmert b4860241dd UI: Add Actions dropdown for New Group, Add Resource, Export/Import 2025-12-16 11:12:35 -05:00
nmemmert 16daa5770e Fix trend delta rendering with safe numeric coercion 2025-12-16 08:54:58 -05:00
nmemmert d4e4467c0c Add trends UI, cleanup logs, refresh build 2025-12-16 08:48:48 -05:00
nmemmert 71d1dbd5c1 chore: commit workspace changes 2025-12-16 07:56:40 -05:00
nmemmert 8bd9c6caf7 feat(ui): dashboard maintenance indicator and yellow uptime during maintenance; rebuild 2025-12-15 16:40:57 -05:00
nmemmert 65fca3d3e3 feat(maintenance): add maintenance_mode flag, API support, UI toggle; skip alerts during maintenance; rebuild client 2025-12-15 16:35:52 -05:00
nmemmert 2329362f09 UI: filters/timeline, SLA card, paginated checks/incidents 2025-12-15 16:25:31 -05:00
nmemmert c8de1257ba Add checks/incidents APIs with filters and SLA summary 2025-12-15 16:22:15 -05:00
nmemmert 49cd477991 Fix timezone formatting fallback by normalizing timestamps 2025-12-15 16:14:04 -05:00
nmemmert 3235ae3789 Fix: return ISO timestamps for dashboard stats and last checks 2025-12-15 16:11:59 -05:00
nmemmert ccae38bb4d Fix: Use ISO 8601 format (T separator) for timestamps to ensure proper timezone conversion 2025-12-15 15:03:25 -05:00
nmemmert fc7bf6976e Fix: Remove /build from client .gitignore to include production builds 2025-12-15 15:00:10 -05:00
nmemmert a93e517d34 Add timezone debugging to client time formatting 2025-12-15 14:55:49 -05:00
nmemmert 88680d478a Add PM2 ecosystem config with timezone support 2025-12-15 14:51:38 -05:00
nmemmert 92cb495ef2 Append Z suffix to timestamps so browser treats them as UTC 2025-12-15 13:45:49 -05:00
nmemmert 91bc41aa5f Fix timezone formatting in client timeUtils 2025-12-15 13:40:51 -05:00
nmemmert c7577f6ce2 Force add client build with timezone fix 2025-12-15 13:39:13 -05:00
nmemmert 28e3c6a544 Fix timezone display: client uses server timezone from settings, revert SQL offset 2025-12-15 13:36:40 -05:00
nmemmert 3653016912 Add detailed logging for timezone offset calculation 2025-12-15 13:29:16 -05:00
nmemmert 95cd2cc746 Invert timezone offset sign for correct SQL datetime conversion 2025-12-15 13:25:56 -05:00
nmemmert 6d361e6359 Add /api/debug/timezone endpoint to verify offset calculation 2025-12-15 13:20:45 -05:00
nmemmert cf62481341 Improve timezone offset calculation by comparing formatted times; add logging 2025-12-15 13:19:45 -05:00
nmemmert 5a92c7f98d Fix timezone offset using Intl API to get accurate UTC adjustment 2025-12-15 13:18:39 -05:00
nmemmert 1c8873b0aa Apply timezone offset to all check timestamp queries (dashboard, resource history) 2025-12-15 13:17:29 -05:00
nmemmert d8f303043f Fix timezone offset calculation (reverse UTC-TZ to get correct adjustment) 2025-12-15 13:16:12 -05:00
nmemmert eda5511609 Server: apply timezone offset to SQL datetime queries for correct timestamp display 2025-12-15 13:14:21 -05:00
nmemmert 0ceedaf032 Rebuild client with ErrorBoundary 2025-12-15 13:08:22 -05:00
nmemmert 0f7d11a197 Client: add ErrorBoundary to avoid blank screen and surface errors; rebuild 2025-12-15 13:04:25 -05:00
nmemmert b7f882f38b SLA: cap by retention in API; SLA UI uses effective days and shows retention notice; rebuild client 2025-12-15 12:59:51 -05:00
nmemmert c8e8d54aa8 Fix SLA queries to use parsed daysNum instead of string days 2025-12-15 12:45:24 -05:00
nmemmert ecfe725f6f Fix SLA component React hook dependencies 2025-12-15 12:38:41 -05:00
nmemmert 8c608d72a3 Add comprehensive upgrade guide 2025-12-15 12:35:12 -05:00
nmemmert 1d95b6d026 Restructure documentation into separate files with links 2025-12-15 12:33:06 -05:00
nmemmert 9892c63f3b Add comprehensive History feature documentation 2025-12-15 12:29:38 -05:00
nmemmert 5e2c236057 Fix parameter count in SQL query 2025-12-15 12:23:55 -05:00
nmemmert 234ac59fe8 Fix SQL bucketing using Julian Day calculation 2025-12-15 12:22:57 -05:00
nmemmert b1b1c36839 Add cache clear endpoint and timestamp to debug logs 2025-12-15 12:21:14 -05:00
nmemmert 07f46ce5c9 Simplify SQL bucketing query to fix aggregation 2025-12-15 12:19:00 -05:00
nmemmert e741c8cadb Enhanced debug logging to trace averaged parameter 2025-12-15 12:17:09 -05:00
nmemmert c7a49432f5 Add server-side debug logging for averaged parameter 2025-12-15 12:14:45 -05:00
nmemmert e308322e00 Add debug logging for averaged mode 2025-12-15 12:11:54 -05:00
nmemmert 3aafa07e04 Fix: use server-provided status for red/green bars in history graph 2025-12-15 12:07:48 -05:00
nmemmert c5027b339b History graph: show down status in red instead of green 2025-12-15 12:04:15 -05:00
nmemmert 63bdc6c91c Enable Show Averages by default in History view 2025-12-15 12:02:08 -05:00
nmemmert c244ebb26c History: request averaged data from server; rebuild client assets 2025-12-15 11:51:16 -05:00
nmemmert 9446737e5a History: return full time window for accurate averaging (7/14/30 days); rebuild 2025-12-15 11:08:03 -05:00
nmemmert 3b2b00d810 History: scale checks_limit by days and averages; rebuild client 2025-12-15 11:00:44 -05:00
nmemmert 3d66b82c88 History API: return up to 100 checks per resource by default (separate from page size) 2025-12-15 10:26:39 -05:00
nmemmert dcc09422c9 Trigger GHCR build 2025-12-15 10:15:16 -05:00
nmemmert 60ea0b7f3e Trigger GHCR build 2025-12-15 10:12:19 -05:00
nmemmert fe0f1ba23b Trigger GHCR build 2025-12-15 10:09:32 -05:00
nmemmert 76fe1d9aae Commit built client assets (main.54d4db7c.js) for deployment 2025-12-15 09:52:13 -05:00
nmemmert ef76d46e96 Use GHCR token fallback for registry login 2025-12-15 09:46:09 -05:00
nmemmert d07250e982 Fix env settings formatting and runtime sync 2025-12-15 09:43:23 -05:00
nmemmert fb175c162b Fix docker publish workflow YAML and GHCR push 2025-12-15 09:41:50 -05:00
nmemmert a5f741b332 Add comprehensive settings: data retention, incident thresholds, alert retry, scheduling, and dashboard customization 2025-12-15 09:40:21 -05:00
nmemmert 41430d0428 Add timezone configuration to settings UI and backend API 2025-12-15 09:24:06 -05:00
nmemmert 0751f30de2 Rebuild client frontend 2025-12-15 09:10:00 -05:00
nmemmert 564aa7c1b8 Fix email stats rendering when avgResponseTime is non-numeric 2025-12-11 14:25:08 -05:00
nmemmert 2cff0b7147 Improve email alert logging for per-resource targets 2025-12-11 14:23:23 -05:00
nmemmert 5a6ce1db00 Fix reinstall script - ensure data directory exists 2025-12-11 13:09:18 -05:00