Skip to main content

Overview

Beacon Mode turns any mobile browser into a field terminal. Operators activate it from the dashboard — it sends periodic GPS pings, allows photo capture with location, and lets operators fire alert signals with one tap. No native app required. PWA-installable on Android and iOS.

How it works

  1. Operator opens the dashboard and taps the [+] FAB
  2. Taps START BEACON — GPS permission requested
  3. Every 30 seconds, a beacon signal is POSTed to /v1/signals
  4. Signal fans out via SSE to all War Room viewers in real time
  5. War Room map shows a live dot for each active beacon with accuracy ring
  6. Operator taps CAPTURE to attach a photo to the current location
  7. Operator taps ALERT to fire a high-priority signal to all org members
  8. Tap STOP or navigate away — DELETE /v1/signals/beacon fires, War Room removes the dot

Device identity

Each device gets a stable UUID stored in localStorage under schedkit-device-id. Format: dev-xxxxxx-xxxxxxxx. This ID is included in every beacon payload as meta.device_id and shown in the War Room.

Capture flow

  1. Browser getUserMedia with {video:{facingMode:'environment'}}
  2. Canvas resize to max 1280px, JPEG at 0.82 quality (~150KB)
  3. Upload to /v1/upload → returns image_url
  4. POST /v1/signals with type: "capture" + image_url + coordinates
  5. War Room drops a purple capture pin — persists permanently on the map

Wake Lock

Beacon mode acquires a WakeLock to prevent the screen sleeping mid-operation. Re-acquired on visibilitychange if released by the OS.

Display modes in the field

The beacon screen follows the global display mode:
  • DARK — default dark interface
  • NITE — deep red palette for dark-adapted human eyes
  • NVG — near-black blue-grey, minimal luminance for I2 night vision goggles
See Display Modes for details.

API calls made by beacon mode

ActionEndpoint
Start beaconPOST /v1/signals {type:"beacon",...}
Periodic pingPOST /v1/signals {type:"beacon",...} every 30s
Photo capturePOST /v1/signals {type:"capture", image_url, lat, lng}
Fire alertPOST /v1/signals {type:"alert", note}
Stop beaconDELETE /v1/signals/beacon

API Reference → Signals

Full endpoint docs including the SSE stream.