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

Share this project:

Updates

Submission history