Inspiration

Buji started with my mother.

We live in Qatar. Almost everything written here is in English or Arabic, and my mother reads neither. Her language is Bengali. A text from her SIM company, the delivery message for a parcel my siblings or I ordered for her, a notice about something happening locally: to most people these are ordinary messages. To her, each one is a closed door.

So she waits. She waits for one of us to get home and read it to her, or she asks someone nearby to explain it. And when something cannot wait, the delay has put her in situations that embarrassed her, ones she never should have been in. It was never about her not being smart or not trying. The information around her simply arrives in languages she cannot read, and that quietly shuts her out of her own daily life. I wanted her to understand things by herself, the first time, without needing anyone.

What it does

You give Buji any English or Arabic text. You can paste it, type it, or take a photo of it. Buji then explains it in simple, everyday Bengali. Not a word for word translation she would still have to figure out, but an explanation of what it actually means. It also pulls out the difficult English words with their Bengali meaning, tells her clearly if there is something she needs to do and by when, and reads the whole thing out loud so it works even if she reads Bengali slowly.

How we built it

Buji is one web page and one small backend function, so a person can open a link and use it with nothing to install.

The page is plain HTML, CSS, and JavaScript. The backend is a single serverless function on Vercel that sends the text to Google's Gemini model and asks it to explain the meaning in simple Bengali and return it in a fixed format. Reading text from a photo happens on the phone itself with Tesseract.js, and the read aloud uses the browser's own speech feature, so those parts need no server and cost nothing. I built and debugged it with Claude Code as my coding assistant, which is listed in the disclosures.

Challenges we ran into

Most of my time went into the parts nobody sees.

The sponsor credits I was expecting did not arrive in time, so I moved the whole backend to the Gemini API.

Then the deployed site kept failing with "the AI could not answer," and it looked exactly like a broken key. It was actually two different problems wearing the same mask. First, the model name I was asking for had been retired, so Google returned a "not found" error. I fixed that by having the app try several model names in order and use whichever one works. Second, I had put my key in a local file, but a deployed site does not read that file, so the key has to be set in Vercel and the site redeployed.

After that came a timeout. The function was cut off after ten seconds on the free plan before the model could answer, so I raised that limit and switched to faster models.

The read aloud was harder than I expected. Browsers load their list of voices slowly, so my first version checked too early, found nothing, and wrongly decided the phone had no Bengali voice. I fixed it to wait until the real list is ready. I also had to be honest about one limit I cannot solve: the voices belong to the phone, not to my app, and not every device has a Bengali one.

Accomplishments that we're proud of

It works end to end, and a judge or a parent can just open a link and use it with no setup.

I am most proud that I built it for one real person I know, and that it removes the exact thing that was stopping her. I kept it honest about what is fully working and what depends on the device, instead of pretending. And I treated accessibility as the point, not a checkbox: everything is readable, the motion turns off completely for anyone who asks for reduced motion, and the read aloud is there for someone who reads Bengali slowly.

What we learned

I learned how model APIs, environment variables, serverless functions, and deploy settings actually fit together, mostly by watching each one break. I learned that an error message which hides the real cause is almost worse than no message, so now my app shows the true reason underneath the friendly one.

The biggest thing I learned is not technical. A translation hands you the same hard thing in another script. What my mother needed was for it to be explained and to be spoken. Building for one real person made every decision clearer than building for a general "user" ever could.

What's next for Buji (বুঝি) — Understand anything, in Bengali

I want to let her ask a follow-up question in Bengali about the same message and get a Bengali answer, so a hard notice becomes a short conversation instead of one explanation. I want to add more home languages beyond Bengali, since many families here face the same wall in Urdu, Malayalam, Tagalog, and others. I want better Bengali audio that does not depend on whatever voice the phone happens to have. And I want to test it with real families in Qatar and change it based on what actually trips them up. Additionally, I want to change the Web app into an application, which will make it easily accessible for everyone who is not that familiar with a mobile phone.

Share this project:

Updates