This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 2
What I Built
My father is an electrician. He runs a repair shop from our home, and people bring him whatever has stopped working: water pumps, submersibles, ceiling fans, coolers, ACs, cutters, mixer-grinders, induction cooktops, room heaters, kettles.
There are two kinds of jobs:
- Fixed on the spot. The customer explains the problem, he repairs it the same day, they pay and take it home.
- Left at the shop. He inspects the machine, tells them what's probably wrong, roughly what it will cost and when to come back. We note a name, a phone number and a village on whatever paper is nearby.
Nothing else gets written down. No slip for the customer, no photo of the machine, no history. When a pump comes back three months later, the only record is his memory. When someone says "this isn't my motor" or "you said 1,200, not 1,500", it's his word against theirs.
Repairwala (रिपेयरवाला) is the record book the shop never had. It's an Android app in Hindi, with big buttons, built for one user: my father.
- He takes photos of the machine, its rating plate and (with permission) the customer.
- He says the job out loud, the way he'd tell me: "रमेश यादव, बरियातू से, सबमर्सिबल मोटर नहीं चल रहा, वाइंडिंग जल गई है, पंद्रह सौ लगेगा, परसों ले जाना" ("Ramesh Yadav from Bariatu, the submersible doesn't run, the winding has burnt, it'll cost 1,500, collect it the day after tomorrow").
- The job card fills itself in: name, village, machine, fault, ₹1,500 estimate, and a pickup date two days from today. The brand, model, power rating and serial number get read off the plate photo.
- He saves it, gets a big job number, and writes it on the machine with a marker.
- When it's fixed, one tap opens WhatsApp straight in the customer's chat with a Hindi message, a voice note saying it's ready and what it cost, and a UPI QR for the exact amount.
Type a customer's phone number and their earlier jobs show up: same pump, what was replaced last time, what they paid.
| A job card | Filling it in | Dark mode |
|---|---|---|
![]() | ![]() | ![]() |
The screenshots use made-up customers.
Who would pay for it
Not my father first. The person who pays is every repair shop like his. Small towns and villages in India are full of one-person shops: electricians, motor-winding shops, mobile repairers, tailors, cycle mechanics. They take in other people's things every day, and almost none of them keep records.
What they would pay for is fewer arguments and more repeat customers:
- Proof. A photo and a job number settle "this isn't my motor" in a second.
- Memory. The history tells him what he did to this pump last time, before he opens it.
- Getting paid. A WhatsApp voice note and a QR with the exact amount mean fewer machines waiting on the shelf, and fewer "I'll pay next time".
The running cost matters as much as the price. A shop that charges ₹150 to change a fan capacitor can't pay per-job fees to a cloud speech API and a cloud LLM. Here the speech recognition and the model run on a laptop the shop already owns, so the only per-job cost is the ElevenLabs voice note for the "it's ready" message: a few seconds of audio.
My guess at a price is a small one-time setup fee, or ₹99 a month. The next step is a few weeks of real jobs at his counter, then showing it to the shops nearby.
Demo
97 seconds: the job list, saying a job in Hindi, the job card and the rating plate, and the "it's fixed" WhatsApp message with its voice note. Made-up customers and a ₹1 test amount.
Code
Rahullkumr / repairwala
Hacktoberfest 2026 Week 2 DEV Challenge - Side Hustle
रिपेयरवाला · Repairwala
The record book my father's repair shop never had. People bring water pumps, submersibles, fans, coolers, mixer-grinders and heaters to his electrical repair shop at home. Until now nothing was written down: no slip, no photo, no history. Repairwala is a Hindi-first Android app for him: he takes a photo of the machine, says the job out loud in Hindi, and a local open-weight model fills in the job card. When it's fixed, the customer gets a WhatsApp message with a Hindi voice note and a UPI QR for the exact amount.
Speech-to-text (whisper.cpp) and the language model (Gemma 4 in Ollama) run on the shop laptop, so customers' names, numbers and photos never leave the shop.
Built for DEV's Hacktoberfest Open-Source AI Challenge, Week 2: Side Hustle.
▶ Watch the 97-second demo video
Features
- Speak the job, don't type it. "रमेश यादव, बरियातू…
A Flutter app for the phone, and a small Node.js server for the shop laptop: Fastify, built-in node:sqlite, whisper.cpp, Gemma 4 in Ollama, ElevenLabs and a UPI QR generator. There's no account and no cloud database.
How I Built It
The phone records, the laptop thinks
A 7.5B model and Whisper won't run well on a ₹15,000 Android phone. They do run on the i7 laptop already in the house, with no GPU. So the phone app is the eyes and ears, and the laptop on the shop Wi-Fi does the heavy work:
Shop phone (Flutter, Hindi) ── shop Wi-Fi ──> Shop laptop (Node server) camera: machine, plate, customer SQLite + photos folder mic: says the job in Hindi ──────────> whisper.cpp (Hindi speech -> text) job list, history by phone Gemma 4 in Ollama (text -> job card, "repaired" -> WhatsApp plate photo -> details) UPI QR with the exact amount only the message -> ElevenLabs (Hindi voice note) Whisper: Hindi, on a CPU, in about 12 seconds
The app records 16 kHz mono WAV and sends it to a whisper-server from whisper.cpp, running the large-v3-turbo model quantised to 5 bits (574 MB). For my test sentences, a 10-second clip took about 12 seconds and came back nearly word-perfect, in Devanagari:
रामेश्वर महतो, पिठोरिया से, सबमर्सिबल मोटर नहीं चल रहा, वाइंडिंग जल गई है, पंदरह सौ लगेगा, परसों ले जाना.
The only differences were spellings: पंदरह for पंद्रह, कैपिसिटर for कैपेसिटर, रुपए for रुपये. English shop words like winding and capacitor come out in Devanagari, the way he says them.
One honest failure: Whisper invents words for silence. Three seconds of nothing came back as "प्रफ्राइब प्रफ्राइब". So the app always shows what it heard, under "आपने बोला (सुधार सकते हैं)" ("you said; you can correct it"), with a button to understand it again.
Gemma reads; code decides
One rule shaped the whole design: the model understands, plain code decides.
Gemma 4 (gemma4:e4b in Ollama) gets the transcript and a JSON schema. It fills in the name, village, machine type, complaint, fault and amount, and the pickup words exactly as said. It never sees a calendar. The server turns आज (today), कल (tomorrow), परसों (day after tomorrow), बुधवार को (on Wednesday) or 25 तारीख़ को (on the 25th) into a date itself.
That split matters for Hindi. कल means both yesterday and tomorrow, but a pickup date is always in the future, so in this app it's always tomorrow. The prompt also teaches the number words a shop actually uses: डेढ़ सौ is 150, ढाई सौ is 250, साढ़े तीन सौ is 350, पंद्रह सौ is 1,500. Code then rejects any amount outside ₹10 to ₹2,00,000.
I tested it on nine sentences, including one with no amount, one with Devanagari digits (३५० रुपये), one with a weekday and one with a date. All nine came out right, in 5 to 25 seconds each.
Reading the rating plate
Every pump and motor has a metal plate with its brand, model, power and serial number. Copying that by hand is exactly what my father would never do, so the same Gemma model reads it from the photo. The prompt is strict: copy only what's printed on the plate, and return nothing rather than guess a brand from how the machine looks.
On a Kirloskar pump photographed at the shop, it read KIRLOSKAR BROTHERS LIMITED, CPBS 73624-V, 750 W / 1.0 HP. It takes 40 to 60 seconds on the CPU, so it runs in the background while he keeps talking. The details appear when they're ready, and anything he typed himself is never overwritten.
"It's fixed": WhatsApp, voice note and UPI QR
When he taps ठीक हो गया (repaired) and enters the final amount, the server:
- writes the WhatsApp text from a template in code (not the model), with the job number, amount and UPI ID;
- asks ElevenLabs (
eleven_multilingual_v2, a warm Indian Hindi voice) to say a shorter version. Amounts are spoken in Hindi words, so ₹1,450 is read as "एक हज़ार चार सौ पचास रुपये", not as English digits; - draws a UPI QR with the exact amount (
upi://pay?...&am=1450.00), so the customer scans it from the gallery in GPay or PhonePe and doesn't type anything.
Then the app hands all three to WhatsApp and opens the customer's own chat, even if the number isn't saved in his contacts. Fully automatic sending would need the WhatsApp Business API, Meta verification and approved templates. One tap on Send is fine.
Things that broke
- The release build crashed before the first screen. The debug build ran fine. The signed release APK died with
NoSuchMethodErrorinsideshared_preferences. That plugin now calls its Kotlin code from Dart through JNI, and R8 had renamedkotlin.coroutines.Continuation, which appears in that method's signature. Keeping the plugin classes wasn't enough; turning off obfuscation (-dontobfuscate, with shrinking still on) fixed it. If I hadn't installed the release build on the phone, the first GitHub release would have been broken. - The form hung on "समझ रहे हैं…" (understanding…). The answer had arrived in 4 seconds, but the re-understand button never cleared its progress message. Now every wait shows a seconds counter and a रोकें (Cancel) button, and a late answer from a cancelled wait is ignored.
- Jobs were saving with no customer. A quick repair could be saved without a phone number, so there was no history. That was the whole problem I was trying to fix. Phone, name and machine are now required in the app and on the server.
Why Does Open Innovation Matter?
- The customers' data stays in the shop. Names, phone numbers, villages, photos of people and their machines, and recordings of my father's voice never leave the laptop. Only the one-line "your machine is ready" text goes to ElevenLabs. A cloud speech or vision API would get all of it, for every job.
- The economics only work at zero cost per job. A ₹150 capacitor job can't carry per-request API fees. Whisper and Gemma on a laptop the family already owns cost nothing per job, and the bill doesn't grow with the number of jobs.
- It works when the internet doesn't. Speech, the model, the job list and the history all run on the shop Wi-Fi. Mobile data in a village comes and goes; only the WhatsApp send needs it.
- I can make it speak our Hindi. My father mixes Hindi, English shop words and our local Nagpuri. Whisper and Gemma are open weights, so the next step is fine-tuning on sentences he actually dictates, with no waiting for a company to decide our dialect matters.
- Nothing to get locked into. Swapping the model is one line in
.env(OLLAMA_MODEL,VISION_MODEL), and so is changing the Whisper size or the voice. Any other shop can copy the repo and run it on their own laptop.
My Agent Session
I built this with Claude Code as my pair: from the first message describing my father's shop, through the server and the app, testing on his phone over USB, and the bugs above. At runtime the app uses no closed-model AI. Whisper and Gemma run locally; only the voice note uses ElevenLabs.
The session is curated: small style tweaks and housekeeping turns are removed, and secrets, real phone numbers and customer details are replaced.





