Logo Lanfrica

alloteyphil/FleetPulse

Domaine:

mobilitydigital infrastructure

Type de record:

software
Créateur:
all
Hôte:
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 …