Skip to content
Back to work
ConceptIndependent concept / exploration

Class Attendance Monitor

Anti-proxy classroom attendance via randomized presence checkpoints

Concept stage — architecture designed, not yet builtProgressive Web AppNode.js / Python + PostgreSQL (proposed)WIFI: QR network joinLocal LAN-only checkpoint server
01Problem

Manual and single-scan attendance methods — roll call, RFID taps, QR scans, one Bluetooth ping — verify presence at a single instant, not for a session's duration. That gap is easy to exploit: a student answers roll call for an absent classmate, or hands a friend their phone for a five-second check-in.

02Why it matters

Sampling presence at several unpredictable moments across a class, instead of once, raises the cost of faking attendance from a five-second favor to coordinating detectable presence at times neither party can predict — closer to a real anti-proxy mechanism than a digital roll call. None of the individual pieces here are new: BLE, Wi-Fi, QR, geofencing and device binding have all been used for attendance before. The question this project actually asks is whether a specific combination of them — randomized, server-held checkpoints proven over a classroom-local network, in a browser — is a practical answer to the single-event problem the existing categories share.

03What I built
  • 01Designed a checkpoint-verification architecture: the server privately picks 3 random moments in a class session and marks a student present if at least 2 are confirmed — the schedule is never sent to any client, so it can't be gamed.
  • 02Iterated through three candidate architectures end to end — native BLE, web + rotating QR, web + instructor-hosted local Wi-Fi — evaluating each against real platform constraints (iOS Bluetooth restrictions, browser mixed-content rules, QR forwarding) rather than picking one and hoping.
  • 03Reviewed the existing categories of automated attendance first, and concluded the individual mechanisms are all well-established — so the project is framed around whether a particular combination closes a known gap, not around inventing anything.
  • 04Not yet built — this is active design work, listed here deliberately as a concept rather than a shipped product.
04Architecture
  1. 01Iteration A — Native app + BLEFlutter app, instructor's device broadcasts a rotating BLE token. Ruled out: native iOS builds need Xcode, a Mac, and an Apple Developer account — none available for this project.
  2. 02Iteration B — Web + rotating QRPWA, checkpoint QR refreshed at random moments. Ruled out: no iOS browser supports Web Bluetooth at all (a WebKit-level restriction), and a QR code is just a photographable image — forwardable to someone off-site.
  3. 03Iteration C — Web + instructor-hosted local Wi-Fi (recommended)The instructor's laptop hosts the network; each checkpoint is confirmed by reaching a LAN-only endpoint. Closes the forwarding hole structurally — a screenshot has no network route to a private local IP.
05Key features
  • 3 server-randomized checkpoint moments per session, never disclosed to the client, so presence can't be gamed by learning the schedule
  • 2-of-3 checkpoint threshold for a present mark — tunable, tolerant of normal Wi-Fi flakiness
  • Manual instructor override on every session, with a required reason — treated as a first-class feature, not a fallback
  • Standard WIFI: QR format for network join, recognized natively by the iOS and Android camera apps — no custom scanner needed
06Challenges

No iOS browser supports Web Bluetooth at all — a WebKit-level restriction, not a background-mode limitation

→ Dropped BLE entirely for the web path rather than building a platform-specific fallback; the local-Wi-Fi mechanism works identically on iOS and Android through one code path.

A photographed QR code can be forwarded to someone outside the room and redeemed remotely

→ Moved the checkpoint check to a LAN-only endpoint hosted on the instructor's device — a forwarded screenshot has no route to a private local IP, closing the hole structurally instead of patching it with geofencing.

A background fetch() from the app's HTTPS page to the instructor's plain-HTTP local server is silently blocked by mixed-content rules

→ Caught in design review before implementation: checkpoint confirmation is done as a full page navigation instead of a background request, since mixed-content restrictions apply to subresource fetches, not top-level navigation.

07Prior art

RFID / smart-card swipe — a card tapped against a reader on the way in.

→ A card is transferable: hand it to a classmate and the system records you as present. Presence here is tied to a device already bound to one account, and re-checked at moments neither party knows in advance.

Biometric — fingerprint or face at a fixed station.

→ Hard to fake, but needs dedicated hardware in every room, queues at high enrolment, and still only proves you were at the door once. This needs no hardware beyond a laptop, and samples across the session rather than at entry.

Static QR / barcode — one code displayed or posted, scanned once.

→ A code is just an image: photograph it, send it to a friend at home, and they redeem it. Confirmation here requires reaching an endpoint that only exists on the room's network, which a forwarded screenshot cannot route to.

GPS / geofencing — device location checked against a radius.

→ Indoor GPS drifts well beyond a single room and is spoofable with mock-location tooling. Network reachability is a coarser signal about the world, but a much harder one to fake from a bedroom.

Single-ping Bluetooth or Wi-Fi check-in — one detection marks you present.

→ This is the closest relative, and the gap it leaves is the whole point: it detects arrival, not attendance. A device can be handed over or walked out the moment the ping lands. Repeated randomized checkpoints are what turn a single event into a sampled one.

08Status

Concept stage — three architectures designed and compared against the existing categories above. No code shipped yet, and no claim that any individual mechanism is novel; the open question is whether this particular combination measurably improves proxy resistance, which would take a built prototype and real testing to answer.