Real-time telemetry console for a 1,200-asset Ghana logistics fleet
# FleetPulse Telemetry Console
A real-time dispatcher console for a **1,200-asset Ghana logistics fleet**.
It ingests a high-frequency IoT stream off the main thread, keeps the UI near
**60 FPS** under load, and gives dispatchers deep-linkable views, optimistic
remote commands with rollback, and an offline-capable last-known fleet.
> Replaces a legacy console that froze or crashed under high-volume live
> streams, causing dispatchers to miss critical alerts.
**Status:** challenge complete (Stages 0–9). Live at
fleetpulse-alpha.vercel.app.
## The challenge
Build a next-generation telemetry console that can:
| Requirement | How FleetPulse meets it |
| ----------- | ----------------------- |
| 1,000+ live IoT assets | 1,200 trucks, vans, EV trucks, reefers, and drones across Ghana’s 16 regions |
| ~60 FPS under load | Web Worker generator + 100ms ingest batcher + TanStack Virtual table (only visible rows mount) |
| High-frequency stream | ~600 events every 250ms ≈ **2,400 events/sec**, flushed into React ~10 times/sec |
| Deep-linkable views | Bidirectional URL sync for search, status, tags, battery range, alerts, sort, and page |
| Optimistic remote actions | Clear alert / Maintenance / Return to service apply immediately, then confirm or roll back with toasts |
| Offline resilience | IndexedDB fleet snapshot + command outbox; stream pauses offline and flushes when connectivity returns |
| Tested core logic | **74 tests**, coverage **≥88%** on every metric (bar was 70%) |
Header pills report **UI FPS** and **Ingest / sec** live so you can verify the
throughput claim while the stream is running.
## What shipped
### Stream and fleet
- Domain model in Zod: assets, alerts, statuses, tags, filter state, persistence
- Web Worker `generator.worker.ts` — no main-thread generation
- `IngestBatcher` with drop-oldest backpressure at 50,000 queued events
- Alert `raisedAt` is preserved while the same alert type stays active
- Refresh hydrates the last IndexedDB snapshot …