Inspiration

We kept coming back to the Composition theme. The grid is a literal composition: fuels stacked into regions, regions tied together by interconnectors and transmission boundaries. Public dashboards show that mix, but you can only look at it. We wanted a map you can touch: turn something off, add storage, cut a corridor, and see what the grid does.

What it does

Lynx is a live, editable map of Great Britain's electricity, drawn as a Factorio-style schematic. Regions are stacks of their generation mix, interconnectors move with the measured flow, and transmission boundaries show how close they are to their limits. You can scrub back through the last 48 hours, make an edit, and see the effect on the mix, carbon intensity, and the network. Every edit becomes a node in a branching history you can undo, compare, and share with a link.

How we built it

The server is Elixir and Phoenix with Postgres. It polls public keyless sources (NESO carbon intensity, Elexon BMRS, NESO Data Portal, Open-Meteo) and pushes updates over a Phoenix Channel. The map is a React island bundled with esbuild. Each scenario runs through three layers: accounting (who generates, who covers a shortfall), physics (can the power cross the network), and policy (priority orders, factor tables, presets). The browser evaluates while you drag so the preview stays live; the server re-evaluates on drop and has the final word.

Challenges we ran into

The network data was the hard part. No public line impedances exist, so we could not do a proper flow model for v1 and gated it: the boundary tier checks net transfer across each cut against its limit, which needs no impedances. Time was fiddly too: settlement periods, 46- and 50-period clock-change days, and keeping 48 hours in the browser so scrubbing needs no requests. The other fight was honesty: measured, modelled, derived, and scenario values must never mix, missing data is never zero, and every result has to state what its tier ignores.

Accomplishments that we're proud of

The branching history works end to end. Edits are immutable nodes, undo never destroys work, you can compare two to four states with deltas traced back to the edits behind them, and a share link carries the full history. The map degrades sanely: missing data, upstream outages, replay mode, and save failures each get an explicit state instead of a blank screen. And CI runs entirely on recorded payloads, so the demo survives even if the upstreams go down during judging.

What we learned

We learned to distrust any number without a label. Once every value carried its source, age, and tier, a lot of design arguments ended: the argument was really about which numbers to trust. We also learned that a weaker model stated plainly beats a stronger one we could not calibrate. Gating the flow tier was the right call; the ledger and boundary tiers answer most visitor questions on their own.

What's next for Lynx

Next is calibration work on the flow tier against NESO's published boundary flows, plus finishing the asset layer with real station locations from OpenStreetMap. After that: longer history, saved workspaces that last past the demo, and presets for common questions (coal-free week, wind drought, interconnector outage) so a first-time visitor gets something interesting in one click.

Built With

Share this project:

Updates

Submission history