Fleet Pulse
Asset managers, PV engineers, operations and executives look at the same fleet and need different answers. Fleet Pulse gives each of them a dashboard built around their decisions, on a synthetic fleet of utility-scale solar and BESS sites across Canada and the US.
- Type
- Personal
- Status
- Live
- When
- 2026
- Role
- Design and engineering
- Next.js 16
- TypeScript
- ClickHouse
- GraphQL
- deck.gl
- Docker
- Storybook
- Vitest
- GitHub Actions
Decisions worth a look
- Four dashboards, one per role, each built around a question: is the portfolio earning what it should, why is this site underperforming, what needs attention now, and are we on track.
- Loss attribution explains the gap between expected and actual output from telemetry alone, and is tested against the generator's answer key: fleet-wide losses land within 8% of the truth, with under 0.5% left unexplained.
- Wash-or-wait advice weighs the soiling a wash would recover against its cost and the next heavy rain, and flags outages worth a truck roll.
- The same ClickHouse image and numbered, forward-only migrations run on a laptop, a cloud droplet or an on-prem Linux host. Nothing on the dashboards calls a third-party service.
- CI runs four jobs in parallel: lint, types and unit tests; every Storybook story in Chromium with axe checks; SQL tests against a ClickHouse service container; and the full build.
One fleet, four views
Each role gets the question it asks, and only the data that answers it.
| Role | The question | What it shows |
|---|---|---|
| Asset manager | Is this portfolio earning what it should? | Revenue earned and lost by site and cause, wash-or-wait payback, the fleet map |
| PV engineer | Why is this underperforming? | A performance-index heatmap, where each shortfall goes, strings below their siblings |
| Operations | What needs attention right now? | A dispatch queue ranked by revenue at stake, with rain and curtailment for context |
| Executive | Are we on track, and where's the risk? | Revenue and energy against a P50 budget, a month-end forecast, a budget-to-actual bridge |
Synthetic data with an answer key
Real fleet data is never public, so the fleet is generated, and the generator keeps score.
- Physics from sun position to inverter output: clear-sky irradiance, cloud cover, module temperature, string DC and inverter clipping.
- Telemetry carries only what SCADA would report, with measurement noise and communication outages.
- Planted faults (inverter outages, curtailment, soiling, offline and degraded strings) come with the energy each one really cost.
- Every value is a pure function of seed, device and time, so any slice of the data can be regenerated exactly.
Built to be checked
Every component is in Storybook and tested in a real browser with accessibility checks. The site explains itself too: a How it's built page reads live table sizes and compression from ClickHouse's system tables, and a Who it's for page writes down each role's assumptions so they can be tested.