← Projects

Sentinel

Live dashboard for a tamper-evident enclosure. An ESP32-C6 watches three sensors, zeroizes its key on breach, and pushes the event over WiFi so it is visible remotely.

2026Group 23, CSE216L hardware labESP32-C6PythonFlaskSQLiteJavaScript
Sentinel screenshot

A hardware lab project with a software half. The device is an ESP32-C6 inside a protected enclosure, watching a reed switch, an LDR and a capacitive touch sensor. On breach it zeroizes a cryptographic key in flash, fires local alerts, and POSTs the event to this dashboard so the breach is visible from anywhere on the network, not only on the device.

System architecture: enclosure and sensors, ESP32-C6, tamper decision, alerts, WiFi to the dashboard

The whole system. Three sensors feed the ESP32-C6; on tamper it wipes the key from NVS, lights the red LED, sounds the buzzer, updates the OLED, and pushes the event over WiFi.

How it works

The device sends tamper and heartbeat events to a small Flask backend that stores them in SQLite and serves them over a JSON API. The frontend polls that API every four seconds and renders live status: secure or breached, last seen, battery, sensors armed, uptime. No page reloads, no hardcoded data.

  • Device-facing POSTs require a shared secret in an X-Device-Secret header. Reads are open on the LAN.
  • One events table. Heartbeats update last-seen and battery but are kept out of the event log.
  • DEV_MODE=1 exposes a simulate endpoint, so the UI can be driven through a real breach and re-arm without the physical device on the desk.

Dashboard in the breached state

Breached. Every sensor shows tripped, the key-zeroized badge is up, the event log records the tamper with a timestamp, and the re-arm button is the only way back.

Flask serves the static index.html from the same origin as the API, so there is no CORS to configure. One process, no build step.