# Changelog ## [v0.1.0] — 2026-06-12 ### Added - initial commit — uptime monitor (forked from go-upkeep) - enhanced dashboard with lipgloss tables, huh forms, mouse support, and animations - upgrade users tab with lipgloss table, edit support, role select - upgrade alerts tab with lipgloss table, click zones, colored types - widen Site struct and DB schema for ping, port, dns, group monitor types - add ping, port, and DNS check routines - add ntfy notification provider with TUI support - add Uptime Kuma backup converter with CLI and API - add mouse wheel scrolling for all tabs - add per-site pause, fix viewport, polish status page - add monitor groups with collapse/expand and tree view - add Telegram, PagerDuty, Pushover, Gotify providers - add Prometheus /metrics endpoint - expose HTTP method and accepted status codes in monitor form - add config-as-code YAML import/export - add distributed probing foundation — schema, models, and probe APIs - add probe execution mode, check extraction, and result aggregation - add region affinity, Nodes TUI tab, and probe metrics - add status bar, tab badges, and detail panel - bordered modals, welcome state, and dynamic name width - DOWN-first sort, health pulse, and site filter - split available width evenly between NAME and HISTORY columns - add type icons to sites table - persist logs to DB, load on startup - add incident management and maintenance windows - zebra striping, detail breadcrumb, sparkline stats, collapse persistence - add --version flag with build metadata injection - add theme system with 4 curated palettes - swap light theme for Tokyo Night and Gruvbox - seed SSH users from env var and authorized_keys file (#31) - show error reason when monitors go DOWN - proper push monitor lifecycle — PENDING, LATE, DOWN states - logs tab overhaul — severity tags, filtering, recovery durations - alert channel health indicator + test alerts - add GitHub release relay workflow - classify error reasons on DOWN monitors - add state change history view with outage duration - add Opsgenie provider - add STALE state for push monitors - add SLA reporting view - overhaul latency sparkline scaling, color, and layout - auto-prune expired maintenance windows - click-to-inspect sparkline tooltips in detail view ### Changed - replace database ID column with row counter - unify SQLite and Postgres into dialect-based SQLStore - add error returns to all Store interface methods - remove store global singleton, thread store explicitly - extract shared HTTPProvider for webhook-based alerts - extract shared table rendering, fix cursor bounds - encapsulate engine state, add graceful shutdown and tests - split release pipeline, add nfpm/homebrew/git-cliff - decompose god files into single-concern modules - consistent chrome across all views - status icons, clean STATUS column, relative time - extract magic numbers into named constants - check all discarded errors in sqlstore_test.go - overhaul tab bar — consistent counts, active highlight, colored alerts - responsive column hiding — 3-tier priority-based layout - swap mattn/go-sqlite3 for modernc.org/sqlite - propagate context.Context through all Store methods - typed Status constants with IsBroken() predicate - schema_version migration table + DeleteAlert FK fix - shared storetest.BaseMock replaces 5 duplicated mocks - consolidate env parsing into appConfig struct - extract Server type with named handler methods - split Site into SiteConfig + SiteState - unify logging with log/slog ### Fixed - forward all msg types to huh forms, improve row selection UX - harden TLS, timeouts, validation, logging, and token generation - add delete confirm, input validation, XSS fix, history persistence - correctness and robustness fixes across all subsystems - make status bar and tab badges visible - use stable sort to prevent site list shuffling each tick - sort children by ID before status to prevent map-order shuffling - sparkline now spans full column width - sparkline right-aligned — current time at right edge, dots fill left - increase history buffer to 60 so sparkline fills completely - compute uptime from windowed statuses, not running counters - seed status and latency from DB history on startup - strip push tokens from /status/json response - correct viewport sizing and dynamic chrome calculation - constrain form height to terminal and forward resize events - skip children in maintenance when computing group status - exclude maintenance'd monitors from down count and pulse - group selection highlight, layout constants, group history graphs - stable monitor count and universal group icons - replace panic with error return, handle unmarshal errors - add context to Provider.Send, log alert failures - constant-time secret comparison, request size limits - graceful shutdown for HTTP, SSH servers and database - add jitter to check intervals and stagger startup - use sh instead of bash for runner compatibility - enable CGO for race detector, use lint-action v7 - install gcc for race detector support - skip irrelevant field validation by monitor type - guard max retries validator for group type - tighten zebra row contrast for Tokyo Night and Gruvbox - phase 1 critical fixes for public release - phase 2 high-severity hardening - phase 3 medium reliability and hardening - phase 4 code quality and low-severity fixes - rename GITEA_TOKEN to RELEASE_TOKEN - remove explicit container, use sh shell - bump golang.org/x/crypto v0.47.0 → v0.52.0 - install git and gcc for GoReleaser in release pipeline - use internal Gitea URL for GoReleaser API calls - use docker-builder runner for Docker image builds - patch Docker Scout CVEs and remove unused openssh-client (#41) - non-root user, supply chain attestations, build cleanup - move SSH host key path into /data for non-root user - create .ssh dir explicitly, ensure entrypoint is executable - resolve git-cliff download URL dynamically - extract git-cliff to /tmp to avoid dirty worktree - make Grype CVE scan non-blocking for known wish vuln - bump Go 1.26.3 → 1.26.4 - remove error truncation from detail panel - classify safedial "failed to connect" as TCP - resolve staticcheck lint errors in history view - trigger immediate recheck after site config edit - broken tick chain after form/dialog + retries off-by-one - wire up [e] edit key in detail panel - show push token and URL in detail panel - show correct push heartbeat curl command in detail panel - propagate STALE/LATE child status to group - quick wins batch — version footer, column widths, zebra, sparkline - logs tab use viewport for scrollable content - pin footer to bottom of terminal - normalize content whitespace for consistent footer position - clip overflowing content to keep footer pinned - remove extra blank lines above footer - expand log viewport to fill content area - log STALE recovery in push heartbeat handler - check fmt.Sscanf return value (errcheck lint) - inject time into ComputeDailyBreakdown for testability - cascade delete related rows when removing a site - merge check results into live state, never overwrite - serialize DB writes through a single drained writer - close XFF bypass and three secret-leak paths - move blocking DB IO out of Update/View into tea.Cmds - move theme styles onto the Model to end cross-session races - finish moving keypress DB reads into tea.Cmds - move all store writes out of Update into tea.Cmds - mask alert secrets in the TUI detail panel and table - serve /status/json through a public DTO - make SSH key revocation fail closed - six correctness fixes for the state machine - migrate Postgres timestamps to TIMESTAMPTZ - seven quick-win bug fixes across engine, server, TUI, CLI - SSRF guard gaps + DNS port restriction + metrics auth - track selection by site ID + q means back everywhere - apply convergence + push/group check history - Kuma import tokens/paused, Docker hardening, migrate-secrets idempotency - six small fixes — rate limiter leak, DST SLA, probe sort, TUI cleanup - seven fixes — token scan, variadic cleanup, TUI layout, compose secrets - chmod SQLite DB files to 0600 on open - close DNS-rebind TOCTOU on ping/port checks - API import no longer replaces user accounts - email send respects context deadline - rename X-Upkeep-Secret header to X-Uptop-Secret - apply log filter to full log list, not viewport window - repair pipeline defects found in v0.1.0-rc.1 rehearsal - suppress wish GHSA alias in grype, fold rc tags into launch notes - scan gates docker push, rc tags spare :latest, mirror waits for stable assets - remove tagged scan image in cleanup step - exclude rc tags from cliff tag_pattern so launch notes span full history - fall back to embedded build info when ldflags absent