Predicts the Remaining Useful Life (RUL) of jet engines from live sensor telemetry, using a real ML.NET model trained on NASA's C-MAPSS turbofan degradation dataset. Held-out engines are replayed cycle-by-cycle and scored in real time, streamed to the dashboard over SignalR.
Stack: .NET 10 + ML.NET + SignalR + React 19 + Recharts.
- A genuine supervised ML pipeline (not a heuristic): FastTree regression on 14 informative sensors, with piecewise-linear RUL labels (clipped at 125 cycles, the standard C-MAPSS practice).
- Honest evaluation on the held-out test set against ground-truth RUL: RMSE ≈ 18.7 cycles, MAE ≈ 14.1, R² ≈ 0.80 — competitive for classic ML on FD001.
- Live inference: test engines stream one cycle at a time through the model; the dashboard shows predicted RUL vs the actual remaining life side by side.
- Anomaly detection: ML.NET SSA spike detection over a degradation-sensitive sensor, surfaced as per-engine alerts.
- Fleet health view (healthy / warning / critical), per-engine detail charts, and a predicted-vs-actual scatter of the whole test set.
C-MAPSS test engines are truncated before failure, but the ground-truth RUL at
the truncation point is provided. Since failure occurs at
lastCycle + trueRUL, the actual remaining life at every earlier cycle is
recoverable as failureCycle − cycle. So the stream carries both the model's
prediction and the real remaining life — an honest live comparison, not a
circular one (the model never sees these engines during training).
backend/ .NET 10
Cmapss.cs dataset parsing, feature selection, RUL labelling
RulModel.cs ML.NET FastTree train / evaluate / persist / predict
AnomalyDetector.cs SSA spike detection (z-score fallback)
Fleet.cs replays held-out engines through the model each tick
TelemetryHub.cs SignalR: modelInfo scorecard + per-tick fleet batch
ReplayService.cs 1.5 s cadence background broadcaster
Program.cs trains at startup, caches rul-model.zip, REST + hub
frontend/ Vite + React 19 + TypeScript
hooks/useTelemetry SignalR connection + per-engine history accumulation
components/ Scorecard, FleetGrid, EngineDetail (RUL + sensors),
ScatterPanel (predicted vs actual)
Hub /hubs/telemetry → client:
modelInfo(once on connect): RMSE/MAE/R², train/test counts, the full predicted-vs-actual scatter, chart sensor names, fleet size, RUL capfleet(per tick): array of engine states (cycle, predicted RUL, true RUL, health, status, anomaly, key sensor readings)
REST: GET /api/health, GET /api/model, GET /api/fleet.
Backend (http://localhost:5299; trains the model on first start, ~1 s):
cd backend
dotnet runFront end (http://localhost:5173):
cd frontend
npm install
npm run devOpen http://localhost:5173. Override the backend URL with VITE_API_BASE.
NASA C-MAPSS Turbofan Engine Degradation Simulation Data Set (FD001), from the
NASA Prognostics Center of Excellence — US Government work, public domain. The
backend/Data/*.txt files are included so the app runs without a download step.