One screen showing what the power system is doing right now: system imbalance, reserve activation, renewable output against forecast, prices across markets. Built for our own trading, then hardened until it could be left alone.
It is real-time energy monitoring for a trading desk: live imbalance, activated reserves, prices and position, refreshed as the data arrives rather than on a schedule. A monitoring dashboard for people whose next decision is fifteen minutes away.
A balancing position is decided from numbers that live in four different places, publish on four different schedules and use four different formats. By the time you have opened the tabs, the quarter hour you cared about is over.
The requirement was simple to state and unpleasant to build: everything relevant on one screen, never more than a minute stale, and it must not lie when a source goes down.
| Panel | Source | Update |
|---|---|---|
| System imbalance | TSO, per minute and per quarter hour | ~1 min |
| Reserve activation (aFRR, mFRR) | TSO | per quarter hour |
| Estimated imbalance price | TSO estimate, later the market operator final value | intraday, then next day |
| Renewables: actual against forecast | ENTSO-E A69 and A75 | hourly |
| Day-ahead and intraday prices | Market operator and ENTSO-E A44 | on publication |
| Reserve auction results | regelleistung.net | daily |
| Cross-border flows | ENTSO-E | hourly |
A SOAP endpoint times out. A REST feed returns 200 with an empty body. A platform serves yesterday's file under today's name. Each needs its own detection, and the dashboard must show stale rather than silently draw an old number as current.
One source publishes large spreadsheet files. The obvious library took seconds per file, which is fine once and unacceptable every minute. Reading the container directly and streaming the XML inside made it 30 to 50 times faster and turned a background job into something that runs inline.
Stale-while-revalidate throughout: serve the last good value immediately, refresh behind it, and mark the panel when the refresh has been failing. The dashboard keeps working through a source outage instead of going blank — and it says so.
Every value carries when it was published, not only what period it describes. That is what makes the same pipeline usable for backtesting later: you can reconstruct exactly what was on screen at any past moment.
The architecture is market-agnostic; only the adapters change. For Germany that means SMARD, Netztransparenz and regelleistung; for Britain, Elexon and NESO; for France, the RTE portal. We have written up each of those in our market data guides.
A first working screen against live data is typically two to three weeks. Everything after that is adding panels and hardening.
Tell us which market and which decision it supports. We will come back with scope, a price range and what we would build first.
Get in touch