f00c78116b
fix: detail page updates all stats, status bar, pings table in realtime via SSE
93c3a1e84a
fix: pin sparkline container to 120x32 to prevent layout shift on update
ed5e213b1a
fix: migrate() uses CREATE IF NOT EXISTS — no more data wipe on restart
1794c05b4f
fix: restore status dot, latency, last-ping time updates on SSE
94d24bac35
fix: fetch sparkline/chart immediately on SSE ping, no debounce delay
b802c7c68b
fix: bust Cloudflare cache on app.js with version query string
66b368453d
refactor: single account-level SSE stream instead of per-monitor connections
55f9f6d8ed
refactor: SSE just refreshes sparkline/chart from server, no DOM stat patching
749c6f391e
fix: SSE stream 500 — replace error() with plain Response in stream handler
15227b9c6e
fix: key_plain -> key in dashboard query
e461d73ce3
refactor: drop all hashing, store keys plaintext
54c89a5a11
fix: store key_plain on sub-keys, display always in settings with copy button
c684d96d90
fix: rename API Keys -> Sub-Keys, show key inline on creation, no reload
ab4f60e159
fix: rotate button inline with key field, updates in place
0c65b5e3fa
fix: just show the login key on settings page
2ec1915ef5
fix: remove pointless internal UUID from settings, show login key label instead
9d8982ae50
fix: key rotation shows new key in dedicated reveal, not sub-key div; clarify account ID label
b80f4673b2
fix: use standard UUID v4 for keys instead of custom 256-bit hex format
bbd5df8c46
fix: 8 groups of 8 chars, not 16 groups of 4
43a1abc2ed
fix: format keys as XXXX-XXXX-...-XXXX (8 groups), normalize before hashing