EcoDNA

Inspiration

Jakarta has a waste problem, but decision-makers don't just have a where problem, they have a what problem. Everyone can point to a hotspot. Almost nobody has a standardized way to know whether it's PET bottles, sachets, cans, or wrappers, even though each of those needs a completely different fix. We wanted to turn everyday waste sightings into environmental intelligence specific enough to actually act on, not just another photo map.

What it does

A user photographs discarded packaging. The image goes to Gemini Vision through a server-side route. The API key never touches the frontend, which returns a suggested classification. Nothing is stored automatically: the user has to confirm or correct that suggestion using standardized dropdowns for category, packaging type, and likely material, and the AI is required to say "Unknown" rather than guess when it isn't confident. Once GPS is captured, the report is confirmed and saved.

Confirmed reports build a Waste DNA Dashboard, dominant material composition by percentage, and a priority tier (High / Moderate / Low) per area, based on how many verified reports actually exist there. From there, the Action Center turns that diagnosis into three concrete paths: deploy equipment, improve collection and behavior, or validate and measure first. Equipment is only ever marked Recommended once real evidence clears a threshold, at least 3 reports, 5 items, and 40% dominant-material share. Below that, it explicitly says Needs more evidence instead of guessing. EcoDNA is built to refuse a confident answer the data doesn't support.

Data integrity

  • Gemini is never treated as the final authority. It accelerates reporting, while human verification protects data quality.
  • "Likely material" means visual identification, not chemical identification. EcoDNA doesn't claim lab-grade analysis.
  • Only confirmed reports count. Pending and rejected reports are excluded from the Waste DNA Dashboard and Action Center entirely.
  • Saying "Unknown" is deliberately built in as better than guessing, a false classification does more damage to the dataset than an honest gap.
  • The dashboard reflects observed reports and survey activity, not a claim of exact citywide waste rates, it's a sample, not a census.

How we built it

  • Frontend: Next.js / React.
  • AI: Gemini Vision, called through a server-side API route so the key is never exposed client-side. Output is normalized server-side into a fixed taxonomy before a human ever sees it — confidence is clamped, brand text is trimmed, and invalid or oversized uploads are rejected outright.
  • Persistence: Supabase, used as the shared backend for confirmed reports. Rather than treating storage as a one-off write, we set it up to hold each report's location, timestamp, and classification fields durably across sessions, so the Waste DNA Dashboard's composition figures and the Action Center's area-level evidence counts are calculated from data that actually persists — not from state that resets every time someone reloads the page.
  • Map: Leaflet with OpenStreetMap tiles, rendering one marker per confirmed report and grouping reports into named or coordinate-rounded hotspot areas for the dashboard.
  • Built with: Claude for frontend scaffolding and iteration speed, freeing up engineering time for the classification pipeline, taxonomy normalization, and Action Center logic rather than UI boilerplate.

Challenges we ran into

  • Keeping AI-assisted classification honest. It was tempting to let the model guess when uncertain, we built "Unknown" as a first-class, preferred answer instead of a fallback of last resort.
  • Making Supabase persistence actually durable. Getting confirmed reports to store reliably and permanently, rather than as a temporary or session-bound write, took real trial and error. Setting up the schema correctly, handling writes consistently, and confirming that reports genuinely survived across sessions instead of being lost or duplicated.

Accomplishments that we're proud of

  • A working end-to-end loop: photo → AI-assisted classification → human verification → geotagged confirmed report → live dashboard → Action Center recommendation
  • An Action Center that refuses to over-recommend, equipment only becomes Recommended once the evidence actually earns it
  • A standardized taxonomy enforced server-side, so every confirmed report is genuinely comparable. Not just a photo log

What we learned

AI can accelerate classification, but trust comes from the constraints built around it, human verification, a fixed taxonomy, an honest "Unknown", not from the model itself. Building a real decision-support tool meant the hardest design work was knowing when not to make a recommendation.

What's next for EcoDNA

  • Before/after intervention measurement, so a pilot becomes proof it worked. Not just an attempt
  • Dashboard filters by category, packaging, material, and time range
  • A database-backed shared store, preserving the current data contract
  • A rewards and partnerships layer, as a potential future addition to encourage sustained community reporting
  • Scale from neighborhoods → Jakarta → Indonesia

Built With

nextjs gemini leaflet openstreetmap claude codex

Built With

  • 21stdev
  • claude
  • codex
  • supabase
Share this project:

Updates

Submission history