Inspiration
Methane is responsible for roughly a third of the warming we see today, and a large share of it comes from a small number of big leaks at oil and gas sites. Satellites like Carbon Mapper's Tanager can now see those leaks from orbit. The problem is what happens next: a detection lands in a public data portal, and nothing connects it to the person who can actually close a valve. The data was never the missing piece. The response was.
We built CH4SE to close that gap: take a satellite detection, work out whose equipment it is, decide how urgent it is, and get a briefed human to acknowledge it.
What it does
- Ingests a real detection. We replay a real Carbon Mapper observation: a Tanager plume from 13 August 2026, estimated at 1993 ± 521 kg CH4/hr.
- Matches it to an asset. The plume origin is compared against a company's registered assets. Exactly one within 250 m is a match, several is ambiguous, none is "no registered asset".
- Sets a priority. Deterministic policy rules use the emission rate and how often the source has been detected before.
- Briefs and alerts the operator. Grok writes a short briefing and the alert goes out through Relay.
- Tracks it to acknowledgement. A live dashboard shows the map, the incident card and a timeline of every step, and flips from red to amber the moment someone acknowledges.
A manager can drive the whole thing in plain language through a Fetch.ai agent on ASI:One: "Do we have any unresolved methane incidents?", "Why is it critical?", "Handle our highest-priority incident.", "Has the operator acknowledged it?"
How we built it
We split into three tracks with one shared contract between them.
- Backend. A SpacetimeDB module holds all state, with the incident lifecycle enforced inside its reducers so no client can skip a step. A TypeScript Core API exposes twelve actions over HTTP, and every agent and the dashboard go through those same actions.
- Agents and data. A Python uAgents agent speaks the Agent Chat Protocol and is registered on Agentverse so ASI:One can reach it. Briefings come from Grok, with a deterministic template as a fallback. Alerts go out through Relay.
- Frontend. A React, Vite and MapLibre dashboard subscribes directly to SpacetimeDB, so it updates the instant an incident changes, with no polling.
Challenges we ran into
- An LLM cannot be trusted with numbers. A briefing that says "2,000 kg/hr" when the estimate is 1993 ± 521 is a false statement about a real facility. Every number is formatted in exactly one place, and Grok's output is rejected if it contains any number that wasn't in its input. If the check fails, the template is used.
- Real data did not match our assumptions. Our loader was written against one file layout, and the live Carbon Mapper API returned another: the location as a map point, and the source summary nested a level down. One of those mismatches would have silently lowered the incident's priority with no error.
- Agents that act need guard rails. Early on, asking the agent "can you walk me through how you handle an incident?" actually triggered one, which would have sent a real alert. Saying "handle" twice sent the alert twice. We made handling idempotent and made the agent treat questions as questions.
- Three tracks, one contract. The dashboard and agents were built against placeholder types before the backend existed. Wiring them to the real thing surfaced mismatches in field names, number formatting and response shapes that only showed up end to end.
Accomplishments that we're proud of
- A full run on a real satellite detection: detection, match, priority, AI briefing, delivered alert, acknowledgement, with the dashboard updating live at each step.
- The same numbers appear on the dashboard, in the alert and in the agent's answers, character for character.
- Pressing "handle" twice sends exactly one alert.
- An agent on Agentverse that passes its generated test suite 5 of 5 and is reachable from ASI:One.
What we learned
- Put the rules where they cannot be bypassed. Enforcing the lifecycle in the database meant a bug in an agent could not corrupt an incident.
- Decide once how a number becomes text, and make everything else quote it.
- Test with real data as early as possible. Our sample data hid every problem the real file exposed.
- For agents, the hard part is the side effects. Reading is safe to get wrong. Sending is not.
What's next for CH4SE
- A live feed that checks Carbon Mapper for new plumes and opens incidents automatically.
- Real asset locations from the OGIM facility database. Today only one of our six assets sits on a real facility; the rest are placed for the demo.
- Routing alerts to different people by role, and real SMS and voice.
- Letting operators acknowledge by replying to the alert.
Built With
- css
- cursor
- grok
- html
- javascript
- maplibre
- node.js
- python
- react
- relay
- spacetime
- typescript
- vite
Log in or sign up for Devpost to join the conversation.