Try the Electricity Strategy Game
No login needed. Part 1 teaches the market economics interactively. Part 2 is a guided tour of every admin capability, for lecturers deciding whether to run the game. Part 3 covers single-player mode.
Based on material from UC Berkeley's EEP/ENVECON C147 — Energy & Environmental Markets, taught by Meredith Fowlie.
Part 1 — Learn the market
All three widgets below use the same ~10-plant slice of the built-in fleet (real plants: Big Creek hydro, Diablo Canyon nuclear, several gas plants, and Four Corners coal), computed live in your browser with the exact clearing rules the game server uses: merit-order dispatch, pro-rata sharing among tied bids, and a scarcity price cap if supply ever falls short of demand.
1. The merit order
Every plant bids into the market at a price. The cheapest bids run first. Edit any plant's bid below and watch the merit order — and the chart — re-sort live.
| Plant | Owner | Marginal cost | Bid | Capacity (MW) | Rank | Dispatch |
|---|
2. Who sets the price?
Every plant is paid the SAME clearing price — the bid of the last, "marginal" plant needed to meet demand. That means cheaper, "inframarginal" plants collect a rent equal to the difference between the clearing price and their own cost, on every megawatt they run.
| Plant | Marginal cost | Bid | Dispatched (MW) | Profit |
|---|
3. Uniform price vs. pay-as-bid
"Pay-as-bid" (every plant is paid its OWN bid, not the clearing price) sounds like it should cost consumers less than uniform pricing — but that's only true if bidders keep bidding their true cost. They don't, once they see the price history.
| Plant | Dispatched (MW) | Marginal cost | Revenue @ uniform | PAB bid | Revenue @ PAB |
|---|---|---|---|---|---|
| Total consumer cost | |||||
| Price paid | |||||
Part 2 — Run the game (for lecturers)
The demo game, demo admin, and fake students below are all created by
scripts/seed_demo.py; the deployment's setup output shows the credentials to use — there is
no real student data anywhere in this walkthrough.
Instructors: log in and create a live sandbox to do all of this hands-on — a throwaway course you can set up and play both the admin and student role in, with every student-facing email landing in your own inbox.
1. Log in as the demo admin
Where: /login
Look for: the admin's name in the top-right nav and an "Admin" area in the menu —
confirms you have is_admin rights.
2. Explore generator sets
Where: /admin/generator-sets
Look for: the built-in original-esg fleet (42 plants, 7 portfolios) and a CAISO-based fleet side by side; use "new set" to compose a custom fleet from any mix of portfolios.
3. Upload the fake roster
Where: /admin/roster — upload data/fake_roster.csv
Look for: accounts created with password = student ID; email delivery stays in "console mode" for these fake addresses, so nothing is ever sent.
4. Build teams and assign portfolios
Where: open the seeded ESG Demo Game from /admin/games, then its
Teams tab (/admin/games/<id>/teams)
Look for: students grouped into teams, each team assigned a practice portfolio from the chosen generator set.
5. Compose the schedule
Where: the game's Schedule tab (/admin/games/<id>/schedule)
Look for: round types (market / auction / capacity), eras (1990s vs. clean-transition fleet rules), bid deadlines, and per-round carbon price & pay-as-bid settings.
6. Experience the student side
Where: log out and back in as a fake student — /portal/
Look for: per-plant bidding with live warnings, a one-click "reset to marginal cost," submission history, and the what-if simulator.
7. Clear a round and read the report
Where: admin dashboard → a round's Clear action, then its
Report view (/admin/rounds/<id>/clear, /report)
Look for: per-block dispatch, clearing price, and every team's profit — this is the same merit-order logic as Part 1, run against submitted bids.
8. Publish results and view standings
Where: Publish action on a cleared round
Look for: students only see results after publishing; standings roll up cumulative profit across rounds.
9. Grant an extension
Where: a round's Extensions tab (/admin/rounds/<id>/extensions)
Look for: per-team deadline overrides, useful for accommodations without moving the whole class's deadline.
10. Run the portfolio auction
Where: an auction round's Run auction action (/admin/rounds/<id>/run-auction)
Look for: teams bidding on whole portfolios, cleared to assign each team its season-long fleet.
11. Capacity planning round
Where: the student capacity workbench, then admin's Capacity plans ranking
(/admin/rounds/<id>/capacity-plans)
Look for: students retiring/building plants against an emissions goal; admin ranks plans by cost, emissions, and reliability.
12. Operations: audit log, email outbox, backups
Where: /admin/audit,
/admin/emails, and the
Back up now button (/admin/backup-now)
Look for: every admin action logged, every "sent" email visible in-app (console mode), and a one-click S3 backup.
Part 3 — Single-player vs. AI
Don't have a full class handy? Create a game with just one human team and let AI opponents play every other portfolio. Each AI strategy is one line:
- Marginal-cost bidder — always bids its true cost (the competitive benchmark).
- Markup bidder — bids a fixed percentage above cost on every plant.
- Adaptive bidder — the default: protects dispatch on inframarginal plants, shades near-marginal plants up toward the expected clearing price, and prices deep-out-of-merit plants toward scarcity levels, learning from past rounds' prices.
See the user manual's AI section for the full strategy reference.