Real-time WiFi RTI & through-wall human detection dashboard for SignalEyez.
Built on FastAPI + Strawberry GraphQL (backend) and React 19 + TypeScript + Tailwind (frontend). Wraps the existing SignalEyez Python engine β no hardware changes required.
BiOScan 1138 is a web-based real-time dashboard that visualizes through-wall human detection using WiFi signals. It leverages Radio Tomographic Imaging (RTI) techniques to detect human presence and movement by analyzing changes in WiFi signal strength (RSSI) from nearby access points.
The system works by:
- Continuously scanning WiFi signals from access points in the environment
- Analyzing RSSI variance patterns to detect movement and human presence
- Using FFT analysis to identify breathing patterns (0.15-0.50 Hz band)
- Generating RTI heatmaps using Tikhonov regularization to visualize person positions
- Providing real-time updates through GraphQL subscriptions over WebSockets
This dashboard wraps the SignalEyez engine, providing an intuitive UI for monitoring and controlling the detection system without requiring any modifications to existing WiFi infrastructure.
CoreWLAN (macOS WiFi)
βββ ScannerService (daemon thread, ~1 Hz)
βββ EventBus [TOPIC_SCAN]
βββ DetectorService β TOPIC_DETECTION β liveDetection (GraphQL sub)
βββ SpatialService β TOPIC_SPATIAL β liveSpatial (GraphQL sub)
bioscan_1138/
βββ main.py β FastAPI entry point
βββ requirements.txt
βββ core/
β βββ config.py β Pydantic BaseSettings (env-driven)
β βββ events.py β Thread-safe asyncio pub/sub event bus
βββ scanner/
β βββ models.py β APReading, ScanCycle
β βββ service.py β Wraps macos_scanner (CoreWLAN)
β βββ schema.py β GraphQL: scannerStatus query
βββ detector/
β βββ models.py β DetectionFrame, APState, BreathingInfo
β βββ service.py β Wraps HumanDetector (baseline β monitoring)
β βββ schema.py β GraphQL: detectionStatus query + liveDetection subscription
βββ spatial/
β βββ models.py β SpatialFrame, PersonPosition, HeatmapGrid
β βββ service.py β Wraps SpatialEstimator + RTI solver
β βββ schema.py β GraphQL: spatialStatus query + liveSpatial subscription
βββ graphql/
β βββ schema.py β Merged schema: Query, Mutation, Subscription
βββ frontend/ β React 19 dashboard (see frontend/README.md)
| Requirement | Version |
|---|---|
| macOS | 12+ (for CoreWLAN) |
| Python | 3.13 (not 3.14 β strawberry-graphql compatibility) |
| Node.js | 18+ |
Python 3.13 via Homebrew:
brew install python@3.13
cd /Users/ibrahim/projects/bioscan_1138
python3.13 -m venv .venv
source .venv/bin/activatepip install -r requirements.txtCreate a .env file in bioscan_1138/:
WIFI_INTERFACE=en5 # your WiFi interface (check: networksetup -listallhardwareports)
SENSITIVITY=medium # low | medium | high
ROOM_WIDTH_M=12.0
ROOM_HEIGHT_M=10.0
CORS_ORIGINS=["http://localhost:5173"]cd /Users/ibrahim/projects/bioscan_1138
source .venv/bin/activate
python -m uvicorn main:app --host 0.0.0.0 --port 8000 --reload- API: http://localhost:8000
- GraphiQL IDE: http://localhost:8000/graphql
- Health check: http://localhost:8000/
β οΈ The scanner needs Location Services enabled for your terminal in System Preferences β Privacy.
query {
engineStatus { isRunning phase sensitivity wifiInterface scanCount }
scannerStatus { isRunning scanCount scannerClass }
detectionStatus { humanDetected confidence breathingDetected phase }
spatialStatus { flatWidthM flatHeightM persons { x y confidence } }
}mutation {
startEngine(sensitivity: "medium", interface: "en5") { isRunning phase }
stopEngine { isRunning }
}subscription {
liveDetection {
humanDetected confidence breathingRateBpm
numDynamicAps numBreathingAps numTotalAps
phase baselineProgress timestamp
}
}
subscription {
liveSpatial {
persons { x y sigma confidence breathingRateBpm }
apPositions { groupId x y isSameRoom }
heatmap { data rows cols }
}
}The frontend is a modern React 19 dashboard with real-time visualization capabilities. It provides an intuitive interface for monitoring WiFi-based human detection and spatial tracking.
- React 19 with latest features (
useOptimistic,useTransition, Suspense) - TypeScript 5.9 for full type safety
- Vite 7 for fast development and optimized builds
- Tailwind CSS 3 with custom dark sci-fi theme
- Apollo Client 3 for GraphQL queries, mutations, and subscriptions
- graphql-ws for WebSocket-based real-time updates
- Recharts for animated signal variance charts
- Three.js + React Three Fiber for 3D spatial visualization
- GraphQL Codegen for auto-generated typed hooks
| Component | Description |
|---|---|
| Toolbar | Engine controls (start/stop), sensitivity settings, WiFi interface selection, connection status |
| Live Signal Chart | Real-time rolling RSSI variance chart showing activity from detected access points over 60s window |
| 3D Spatial Map | Interactive 3D RTI heatmap visualization with detected person positions and AP locations |
| Status Indicator | Live detection status with pulsing badges (CLEAR/MOVEMENT/HUMAN DETECTED), confidence percentage, breathing rate BPM, and AP statistics |
| System Info Panel | Technical details about the detection algorithms and framework |
- Connecting β Loading spinner while establishing WebSocket connection
- ENGINE IDLE β System ready, awaiting start command
- CALIBRATING β Yellow progress bar during baseline collection (~30s, keep area clear)
- CLEAR π’ β No human presence detected
- MOVEMENT π΅ β Motion detected but below human detection threshold
- HUMAN DETECTED π΄ β Confirmed human presence with pulsing indicator and breathing BPM
- WebSocket subscriptions for live data streaming with automatic reconnection
- Optimistic updates for instant UI feedback on control actions
- Responsive grid layout that adapts from mobile (single column) to desktop (5-column grid)
- Smooth animations with Suspense-based loading states
- Auto-generated GraphQL hooks with full TypeScript inference
cd frontend
npm install
npm run devFrontend runs on http://localhost:5173 and connects to the backend at http://localhost:8000.
For detailed frontend documentation, see frontend/README.md.
- The backend imports modules from SignalEyez at runtime via relative path
../signaleyez/(hardcoded inspatial/service.py). Both projects should live side-by-side under~/projects/:~/projects/ βββ bioscan_1138/ β This project βββ signaleyez/ β Clone from https://github.com/Yuribenjamin/signaleyez - Baseline collection takes ~30 seconds with the area clear. Keep the scan zone empty during calibration.
- Sensitivity presets (
low,medium,high) are defined insignaleyez/signal_processing/human_detector.py. - WebSocket subscriptions use the
graphql-wssub-protocol (not the legacysubscriptions-transport-ws). - The system requires macOS 12+ for CoreWLAN WiFi scanning capabilities.
- Location Services must be enabled for your terminal application in System Preferences β Privacy for WiFi scanning to work.