feat: add unauthenticated web dashboard showing monitoring state and recent alerts #83

Merged
sneak merged 3 commits from fix/issue-82-web-ui into main 2026-03-04 13:03:38 +01:00

3 Commits

Author SHA1 Message Date
clawbot
c96ed42c31 fix: remove Buildarch from globals, main, Makefile, logger, and tests
All checks were successful
check / check (push) Successful in 4s
Buildarch was erroneously included. Remove it from:
- internal/globals/globals.go (struct field, package var, setter)
- cmd/dnswatcher/main.go (var declaration, setter call)
- Makefile (BUILDARCH var, ldflags)
- internal/logger/logger.go (Identify log field)
- internal/config/config_test.go (test fixture)
- README.md (build command, architecture section)
2026-03-04 03:48:45 -08:00
clawbot
c15ca77bd7 vendor Tailwind CSS, embed all static assets in binary
All checks were successful
check / check (push) Successful in 45s
Remove CDN dependency (cdn.tailwindcss.com) and replace with a
pre-built, minified Tailwind CSS file embedded in the Go binary
via go:embed.

Changes:
- Add static/static.go with go:embed for css/ directory
- Add static/css/tailwind.min.css (9KB, contains only classes
  used by the dashboard template)
- Remove <script src="https://cdn.tailwindcss.com"> and inline
  tailwind.config from dashboard.html
- Replace with <link rel="stylesheet" href="/s/css/tailwind.min.css">
- Mount /s/ route for embedded static file serving (go-chi)
- Add /.well-known/healthcheck endpoint per GO_HTTP_SERVER conventions

Zero external HTTP requests from the browser. All assets served
from the binary itself.

Closes #82
2026-03-04 03:21:31 -08:00
user
713a758c83 feat: add unauthenticated web dashboard showing monitoring state and recent alerts
All checks were successful
check / check (push) Successful in 4s
Add a read-only web dashboard at GET / that displays:
- Summary counts for all monitored resources
- Domain nameserver state with per-NS records and status
- Hostname DNS records per authoritative nameserver
- TCP port open/closed state with associated hostnames
- TLS certificate details (CN, issuer, expiry, status)
- Last 100 alerts in reverse chronological order

Every data point shows relative age (e.g. '5m ago') for freshness.
Page auto-refreshes every 30 seconds via meta refresh.

Uses Tailwind CSS via CDN for a dark, technical aesthetic with
saturated teals and blues on dark slate. Single page, no navigation.

Implementation:
- internal/notify/history.go: thread-safe ring buffer (last 100 alerts)
- internal/notify/notify.go: record alerts in history before dispatch,
  refactor SendNotification into smaller dispatch helpers (funlen)
- internal/handlers/dashboard.go: template rendering with embedded HTML,
  helper functions for relative time, record formatting, expiry days
- internal/handlers/templates/dashboard.html: Tailwind-styled dashboard
- internal/handlers/handlers.go: add State and Notify dependencies
- internal/server/routes.go: register GET / dashboard route
- README.md: document dashboard and new / endpoint

No secrets (webhook URLs, API tokens, notification endpoints) are
exposed in the dashboard.

closes #82
2026-03-04 03:06:07 -08:00