Inspiration:
Off-grid microgrids fail in one of two ways: a dashboard with no real control logic behind it, or a rule table that can't tell a stuck sensor from a real event. Either way, an operator is left alone to guess during a storm. We wanted a real answer to the question every judge eventually asks — why does this need an LLM at all — built into the architecture, not just the pitch. Triton, named for the sea's herald, is that answer.
What it does:
Triton manages a fictional island microgrid, Kailoa Island — solar, wind, battery, diesel — serving a hospital, a desalination plant, a school, and surrounding villages. Three layers, with a hard boundary between them:
Sensing — simulated telemetry, including realistic faults (stuck sensors, equipment failures, fuel that runs out). Deterministic dispatch — the only layer allowed to decide anything: merit-order dispatch, priority-tiered load shedding (Tier-0 critical loads are never auto-shed), fuel-limited diesel. Every cycle produces an auditable decision trace and is checked against physical invariants. A Claude reasoning layer — sits above the loop, never touches a breaker: plain-language briefings, anomaly triage over correlated signals, and grounded Q&A over the decision trace.
A live dashboard shows all of it: an island map, a one-line schematic, a "Why?" trace drawer, a 24-hour impact summary, and a one-click scripted crisis demo.
How we built it:
A Python reference backend (sensors, optimizer, validator, Claude advisor) ported function-for-function into JavaScript for the browser dashboard. 37 automated tests, plus a 72-hour reference simulation checked into the repo as reproducible proof:
Diesel saved = (E_naive - E_actual) / E_naive × 100% ≈ 35%
— with 1.9% of demand ever shed, 35 anomalies correctly flagged, and zero invariant violations across 288 simulated ticks.
Challenges we ran into:
Deciding exactly what Claude is for — two scoped jobs (anomaly triage, grounded Q&A), never dispatch. A published dashboard can't call the Anthropic API from a browser sandbox. Instead of hiding that, we built a clearly-labeled offline fallback plus a separate live-Claude REPL as genuine proof. Our own invariant validator caught a real bug: diesel was dispatching without being limited by remaining fuel. Keeping the Python and JavaScript dispatch logic in sync by hand — nothing yet enforces that automatically.
What we learned:
An invariant checker earns its keep the moment it catches a real bug, not a hypothetical one. And the strongest answer to "is this just an AI wrapper" is a boundary you can point to in the code, not a line in the pitch.
What's next for Triton:
Real MQTT/Modbus ingestion, a live counterfactual re-dispatch engine, automated Python/JS parity tests, SMS alerting, and a capacity-planning mode — our 72-hour run already shows battery storage, not diesel or solar, is the binding constraint on renewable fraction.
Built With
- built-with-python-and-the-anthropic-claude-api-on-the-backend
- bundler
- css
- database
- frontend
- html
- inline
- javascript
- kpi-dashboard
- svg
- tested-with-pytest
- vanilla
Log in or sign up for Devpost to join the conversation.