Inspiration

India's NGOs run on two layers that can't talk to each other. Coordinators and donors live in English Slack channels; the ASHA workers, field volunteers and community organizers doing the actual work speak Hindi, Tamil, Bengali, Marathi. Field reports travel by phone call, get retyped by whoever's bilingual, arrive late or distorted — and the people closest to the problem are invisible in the org's own communication tool. We built Setu (सेतु = "bridge" in Hindi) because the barrier to participating in a modern workplace shouldn't be English.

What it does

Setu makes every Slack channel multilingual, in both directions:

  • Two-way thread bridging. A field worker posts in Hindi in #field-updates. Setu instantly threads a faithful English translation. A coordinator replies in English inside that thread — Setu translates the reply back into Hindi, in the same thread. Neither side changes how they write.
  • Ask in your language. Setu's AI assistant panel (a Slack AI capability) answers questions about any channel in whatever language you ask it in. A Tamil-speaking director asks "இந்த வாரம் என்ன நடந்தது?" about an all-English channel and gets a Tamil digest, with names and decisions pulled from the real transcript.
  • Open tools via MCP. Setu exposes its translation engine and an NGO/government-scheme glossary (SHG, ASHA, MGNREGA, anganwadi, and more) as an MCP server, so any other agent — Claude, Cursor, a partner NGO's own bot — can reuse the same domain-accurate translation.

How we built it

Node.js + Slack's Bolt framework running in Socket Mode, so no public server or tunnel is needed. Slack AI assistant threads (assistant_thread_started, suggested prompts, live status updates) power the Q&A surface; channel message events power the two-way bridge. Gemini 2.5 Flash does single-shot detect+translate calls — deliberately no multi-step agent chains, so replies land in about a second and nothing times out on stage. The MCP server runs on the official TypeScript MCP SDK over stdio, exposing two tools: translate_message and glossary_lookup.

Challenges we ran into

Keeping translations trustworthy for domain-specific terms is the whole reason the glossary exists — "ASHA" is a job title (Accredited Social Health Activist), not a name, and a naive translator will mangle it. We also had to resist the urge to build a full conversational agent chain for the assistant; keeping it to one Gemini call per question was the difference between a snappy demo and a laggy one.

Accomplishments that we're proud of

A genuinely two-way live bridge — not just inbound translation — that we tested end-to-end with real Hindi and Tamil messages before recording. A working MCP server verified with an actual MCP client, not just built and assumed working. And a product that's useful on day one with zero configuration: no per-user settings, no onboarding flow, just @setu in a channel.

What we learned

That the smallest agent chain is usually the right one for a live product — one well-scoped Gemini call per event beat every multi-step design we sketched. And that translation quality for underserved use cases lives or dies on domain vocabulary, not raw model quality.

What's next for Setu

Per-user language preferences in App Home, persistent bridge memory across restarts, voice-note transcription for low-literacy field contexts, and a Slack Marketplace listing so any NGO can install Setu directly.

Built With

Share this project:

Updates