How We Built Civicloop to Turn Roadside Photos Into Trackable Reports
A photo can document a public-space problem, but it rarely shows what happened next. We built a mobile reporting workflow on AWS that connects visual evidence, ward lookup, email, and community verification.
We Built Civicloop Because a Photo of a Problem Should Lead Somewhere
A pile of rubbish beside a road is easy to photograph. It is much harder to know what happens next.
Which ward is it in? Who should receive the report? How can they find the spot? And if someone says it has been cleaned, who checks?
We built Civicloop for the Waste and Energy track of WeMakeDevs Environmental Hacks . It is a mobile web app that turns a photo or short video of a public-space problem into a located report, sends the evidence to a configured recipient, and gives nearby residents a way to check whether the issue is still there.
From a photo to a report
A resident can open Civicloop on their phone, use the live camera or upload evidence, and allow location access. The app accepts up to four photos or one video of at most 15 seconds.
Location is more complicated than it first appears. A photo may contain GPS metadata, but images shared through messaging apps often lose it. Civicloop checks image or video metadata first and uses the phone’s location when that is unavailable. For Bengaluru, it then checks the coordinates against ward boundary polygons.
The image review has a second job: deciding whether the evidence actually shows a supported public-space issue. It should not create a waste report from an unrelated photo or call an ordinary road “damaged.” When the issue is clear, the vision agent proposes a category, title, details, and summary. The resident reviews those fields before creating the report.
That review step matters. AI can describe what appears in an image; it cannot establish who caused it, whether an authority has already acted, or whether a repair is complete.
The part we cared about most: the follow-up
A report should remain useful after the first email.
Civicloop keeps the evidence and status on a shared map. The report email includes the photo when it is small enough to attach, a directions link, and a private link through which the recipient can submit one repair photo or video. That submission does not close the issue on its own. Residents passing nearby can check the place and mark whether the problem remains or appears fixed. Two distinct fix checks are needed for community verification.
For unresolved reports, an AWS scheduled job can send a reminder after three days. If a report is still open after seven days, the reporter opted in to public sharing, and another resident confirms that the issue remains, Civicloop can publish one Instagram follow-up. The private repair link never goes into that public post.
What runs on AWS
The mobile frontend is served through Vercel, while the reporting workflow runs in AWS in
ap-south-1 :- Amazon Cognito handles sign-in.
- Amazon API Gateway and AWS Lambda handle report creation, image review requests, dispatch, and status changes.
- Amazon DynamoDB stores reports, checks, and submission limits.
- Amazon S3 holds evidence privately; short-lived signed URLs handle uploads and access.
- Amazon EventBridge triggers the scheduled follow-up work.
- AWS Secrets Manager holds the credentials used by server-side integrations.
- Amazon SES is an email fallback, and Amazon CloudWatch holds operational logs.
AWS SAM defines and deploys the backend. The image and email drafting path currently uses a budget OpenAI model, with Amazon Bedrock available as an alternative when a model is enabled in the selected Region. The AI drafts text; Lambda enforces ownership, evidence limits, location checks, and the daily limit of five submission attempts per user.
What fought back
The photo did not know where it was taken. For one real roadside-litter report, the image had no usable GPS. We knew the ward but not the exact stretch of road. The report therefore says its Ward 13 Kodigehalli pin is approximate. A convincing-looking map marker is worse than an honest one if it sends someone to the wrong place.
A ward boundary is not a contact directory. Matching coordinates to a ward is useful, but it does not prove which official owns the issue or what email address they use. Civicloop can route to a verified ward contact when one is configured. Until then, it labels the fallback recipient. We did not want a successful email send to be mistaken for confirmed municipal delivery.
An AI result needed a gate. The first version of a report flow can easily become “upload any image and generate official-looking text.” We changed the workflow so the image must pass a relevance check before it can become a report. The person submitting it still reviews the proposed description.
A repair photo is a claim, not a resolution. The recipient can submit evidence through a private link, but residents still need to verify what is visible at the site. That distinction became the core of Civicloop.
One report that went through the full publishing path
We used a photo showing discarded plastic and other litter beside a road. Civicloop classified the visible issue as Waste dumping, matched the supplied approximate location to Kodigehalli Ward 13, stored the report and photo, and sent an email with the image attached to the configured project mailbox. It also published the report on Instagram .
This proves that the review, storage, email, and publishing path can run. It does not prove that a ward authority received the report or that the roadside was cleaned. The map pin is marked approximate because the original photo had no GPS. Those are the next pieces to improve: verified ward contacts and more precise evidence from the capture point.
Why this project matters to us
People already notice these problems. They take photos, warn friends, and sometimes post publicly. We wanted to connect those actions into a process where the location, evidence, request, and later checks stay together.
Civicloop will be useful only if it earns trust: by rejecting irrelevant reports, distinguishing approximate locations from exact ones, showing who received an email, and waiting for independent checks before calling something fixed.
The code is public on GitHub , and the app is live . We built Civicloop with AI-assisted coding using Codex; the deployed app also uses AI to review image evidence and draft report text. Bengaluru ward boundary data is credited in the repository to the Greater Bengaluru Authority dataset published through OpenCity. Civicloop is independent and is not affiliated with BBMP or any government body.
Enjoyed reading this content? Let the author know!
Your likes, comments, shares, and saves help creators reach more builders.
Loading recommendations
Loading article