Replaced window.prompt() with a real login screen:
- Centered card, brand mark, hidden password-type input
- Inline error state on invalid token
- Overlay shown until token validated, then app rendered
Favicon: inline data-URI SVG with concentric radio-wave rings,
zero external requests, no /favicon.ico 404 in logs.
Dashboard:
- Optional DASHBOARD_TOKEN env var (K8s secret 'snek-dashboard-secret')
- Flask before_request check via Authorization header or ?token= param
- /webhook and /healthz remain public (SNEK POST needs to reach webhook)
- Frontend prompts for token on first load, stores in localStorage
- Token forwarded on fetch() calls and EventSource URL
README decoding section:
- Split into two full sub-sections for Sens'it Discovery (v3) and Sens'it v2
- Explicit bit ordering note (MSB-LSB v3 vs LSB-MSB v2)
- Byte-by-byte tables, formulas per mode, worked examples
- Note that auto-detection uses byte 0 bits 2-0 == 0b110 marker for v3
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Replaced connection status badge with a small colored dot in the header
(green when connected, red when disconnected, gray while connecting)
- Removed the 'button' badge on device cards - it duplicated the info
already shown when mode == Button and just added visual noise
- Light theme with slate palette (bg #f8fafc, cards white with borders)
- Inter font + JetBrains Mono for hex/device IDs
- Emojis removed, replaced with colored text badges (mode, format, alerts)
- Battery/RSSI shown with tone-based badges (green > amber > rose)
- Cleaner header, connection status pill with dot indicator
- Chart with cleaner grid, tooltip, and legend positioning
- Table with proper typography and hover states
- Footer with brief system info
Inspired by modern SaaS dashboards (Linear, Stripe, Cal.com).
Sens'it v2 has a totally different payload layout than Discovery v3:
- Bit order LSB→MSB (was MSB→LSB in v3)
- Mode in bits 0-2 (was bits 7-3 in v3)
- Battery split across bytes 0 & 1 (was 5 contiguous bits in v3)
- Temperature always sent (in T° MSB byte 1) even outside temp mode
Auto-detection uses byte 0 reserved bits: 0b110 = v3, otherwise = v2.
Frontend updated to render new fields: move_events, reed_events, fw_major/minor.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Small companion service that receives SNEK callbacks, decodes Sens'it
Discovery payloads for all 6 modes (Standby, Temperature, Light, Door,
Vibration, Magnet), stores in SQLite, and serves a responsive dashboard.
Backend (Python Flask):
- POST /webhook: receive SNEK callback
- GET /api/devices, /api/messages, /api/decode
- GET /events: Server-Sent Events for live push
- SQLite persistence at /data/messages.db
Frontend:
- Tailwind CSS via CDN, Chart.js for temp/humidity graph
- Live updates via SSE
- Device cards with icons per mode
- Message log with human-readable summaries
Deploy:
- Separate deployment (snek-dashboard) with own PVC
- LoadBalancer on 192.168.1.213:80
- SNEK callback URL: http://snek-dashboard.snek.svc.cluster.local/webhook
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>