AWS Builder Center
Kabadi Connect: Building a Hindi, Voice-First Recycling Network on AWS

Kabadi Connect: Building a Hindi, Voice-First Recycling Network on AWS

Kabadi Connect is a Hindi-first, voice-enabled recycling pickup platform built on AWS. Explore how we used serverless architecture, DynamoDB transactions, Amazon Location Service, and layered AI fallbacks to make informal recycling more accessible and accountable.

I build privacy-first, on-device AI systems and study their performance in real-world conditions.
Built for the WeMakeDevs × AWS Environmental Hacks (Waste and Energy track).  Live demo  |  Source code on GitHub 
By Animesh Dhiman



See Kabadi Connect in action



Watch the demo to see how Kabadi Connect brings together household pickup booking, Hindi voice assistance, collector workflows, route planning, and recycling impact tracking.




The problem



Kabadiwalas buy newspapers, plastic and metal from households, and that keeps a lot of recyclable material out of landfills. Almost all of this work happens without digital tools or records. Estimates of how many people do it in India range from 1.5 million to 4 million, depending on who gets counted.
Households rarely know when a collector will show up, so recyclables often go in the bin. Collectors walk lanes where nobody has anything ready. An app that begins with an email address and a password loses many of them at the sign-up screen. With no record of what they collected, cities can't measure the work and collectors can't show it as proof of income.
We built Kabadi Connect around the collector, because a conventional app would exclude them first.



What we built




Households

A household books a pickup by choosing a day in the next seven days and a two-hour slot. They can also say or type something like "kal shaam 5 kilo raddi" and the assistant proposes a booking. If they add a photo of the recyclables, the app uses what it sees to pre-fill the details.
After booking, they can follow the pickup, see how far away the collector is, and print a receipt. The point is to make pickups easy to schedule and to spare collectors wasted trips.

Kabadiwalas

An administrator prints a QR card for each collector. Scanning it signs them in, with no email or password. The interface is Hindi-first, with large icons and simple actions. Anyone who prefers a normal login can use a phone number and password.
The voice assistant answers questions like "is mahine kitna kamaya?" and gives spoken turn-by-turn directions such as "150 मीटर बाद दाएँ मुड़ें." It never saves anything on its own. The collector has to say or tap "haan" first.

Cities and communities

Impact numbers are based on weights the collector measures, and households can confirm them. A methodology page lists the formulas, emission factors, sources and limitations behind the estimates.
Each collector can also get a monthly statement with kilos collected, rupees earned and the number of pickups households confirmed. It leaves out household addresses, so a collector can use it as income evidence.



How it fits together



The frontend is a React progressive web app on Amazon S3 behind CloudFront. API Gateway sends requests through Cognito authorization to Lambda functions (Node.js 22, arm64), and DynamoDB holds all application data in a single table.
Creating a pickup puts work on an SQS queue. A dispatcher Lambda also runs on an EventBridge schedule every five minutes. Amazon Location Service handles waypoint optimization, route calculation and map tiles.
For voice, the phone sends audio to Lambda, Amazon Transcribe turns the Hindi speech into text, the assistant logic interprets it, and Amazon Polly speaks the reply. For photos, the app tries vision through Amazon Bedrock and falls back to Rekognition labels.
One AWS SAM template defines about 40 functions, the table, the queues, the Cognito pool and clients, CloudFront, maps, alarms and a dashboard.



The AWS decisions that mattered




1. DynamoDB transactions for state changes

A pickup moves through  OPEN → ASSIGNED → EN_ROUTE → PICKED . The dispatcher, a collector claiming it, an administrator assigning it by hand and a household cancelling it can all try to change it at nearly the same moment.
Every transition is a  TransactWriteItems  call with a condition on the current status. If something else got there first, the losing request gets a clean  409  instead of a double assignment. Confirming a pickup updates the request and two impact counters in a single transaction, so a retry can't count the same kilos twice. We didn't need any application-level locks.

2. Cognito custom auth for QR-card sign-in

The QR card holds a one-time code. We store its hash on the collector's record, and the Cognito verification trigger consumes it with a conditional update, so the code works once. Issuing a new card invalidates the old one. Blocking a collector whose phone is lost signs them out everywhere.
There is no password for the collector to remember.

3. Amazon Location Service for routing

 OptimizeWaypoints  orders a collector's stops in one call. We also keep the original request order, so the app can show the difference, for example "2.1 km instead of 3.4 km."
For navigation,  CalculateRoutes  returns the route line and the turn-by-turn steps together, using the Pedestrian and Scooter travel modes. We work out left and right turns from the route geometry and wrote the Hindi instruction phrases ourselves instead of using the API's wording.
If a routing call fails, dispatch falls back to nearest-neighbour ordering with 2-opt. A map outage shouldn't stop pickups from being assigned.

4. Hindi voice with a fallback at each layer

Polly's neural Hindi voice, Kajal, speaks the assistant's replies. Common phrases are cached on the phone so they aren't regenerated every time. Transcribe is the first choice for speech-to-text.
For the assistant's reasoning we try Bedrock first, then a free Groq model, then plain keyword rules. We log which path answered so we can see how often the fallbacks kick in.
The language model doesn't write the sentence the collector hears and doesn't touch application data. It picks a tool, and Lambda validates the request and builds the reply from real data. The phone acts only after the collector confirms.

5. Reading the change set before every deploy

Before each release we read the CloudFormation change set (adds, modifications, removals) and only then executed it. Nothing surprising turned up in any of them.



What went wrong along the way




Requests nobody could see

Our first matching rule only offered a request to collectors whose listed map cells matched it, and only after enough weight had piled up. A booking in a new town could match nobody at all. We switched to distance. Each collector now has a service radius around their home, requests are offered 12 hours before the slot, and collectors can claim unassigned requests from a nearby board. If a household's address isn't covered, the app now says so.

Map keys and a web worker

Creating a key for the newer Amazon Location map actions failed with an error that didn't say which action was the problem, so we moved to the older map resource. After that, referer restrictions caused  403  errors for MapLibre's web worker, because a blob worker doesn't send our site as its referer. Serving the worker script from our own domain fixed it.

Waiting on Bedrock

Our AWS account sat in "being verified" status for more than a day. Since the model lives behind one function with fallbacks, the product kept working on keyword rules and Rekognition labels in the meantime.

"Cancel" and raddi

Our keyword fallback matched "cancel" against  radd , which is also how raddi, the Hindi word for waste paper, begins. So "5 kilo raddi" could cancel a pickup. A test caught it. We now test ordinary phrases in every language we support, not just the commands we expect people to say.



Testing, cost and guardrails



The project has:
  • 90 unit tests covering batching, routing, handlers with mocked AWS calls, card login, voice intents, scheduling and directions
  • 33 browser tests at phone size, including accessibility checks
  • a smoke test against the deployed stack that runs the whole loop: request, dispatch, route, pickup, household confirmation and impact calculation
When idle, the stack costs a few cents a month. Voice and photo features have daily per-user caps, Lambda logs are kept for 30 days, and the public judge demo creates temporary collectors under a daily limit. Demo data expires after three days and stays out of real impact totals.



Limits



Our CO₂ factors come from the US EPA's WARM model and are applied to Indian conditions, so the results are estimates and haven't been validated locally. We haven't run a field pilot, and the numbers on the live dashboard come from test pickups. We also haven't tried the microphone and GPS directions on a wide range of low-cost phones.
The repository has the full plan, the survey we prepared for kabadiwalas, and the project's limitations.



Next



We want to run a one-neighbourhood pilot with five kabadiwalas and a resident welfare association. After that, the plan is an Android wrapper for background location, more Indian languages through Bhashini, and an IVR phone line for collectors who only have basic phones.
Kabadi Connect hasn't been proven in the field. It is a working system we can use to find out whether better scheduling, simpler interfaces and verifiable records make informal recycling easier for households and for the people who collect from them.
#AWS #Serverless #AmazonLocationService #DynamoDB #Cognito #AmazonPolly #Sustainability
Any opinions in this article are those of the individual author and may not reflect the opinions of AWS.
Enjoyed reading this content? Let the author know!

Your likes, comments, shares, and saves help creators reach more builders.

Loading recommendations

Loading article