<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Koushikxd</title>
    <description>The latest articles on Forem by Koushikxd (@koushikxd).</description>
    <link>https://forem.com/koushikxd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1190111%2F6f3336f4-6c55-49dc-bb41-837c1d5c4287.jpg</url>
      <title>Forem: Koushikxd</title>
      <link>https://forem.com/koushikxd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/koushikxd"/>
    <language>en</language>
    <item>
      <title>I Built Bridge, a Multilingual AI Health Companion for Everyone</title>
      <dc:creator>Koushikxd</dc:creator>
      <pubDate>Fri, 13 Mar 2026 19:17:18 +0000</pubDate>
      <link>https://forem.com/koushikxd/i-built-bridge-a-multilingual-ai-health-companion-for-everyone-2185</link>
      <guid>https://forem.com/koushikxd/i-built-bridge-a-multilingual-ai-health-companion-for-everyone-2185</guid>
      <description>&lt;p&gt;This idea came from the kind of problem everyday almost everyone in a family deals with at some point.&lt;/p&gt;

&lt;p&gt;I mainly built this because daily medicines are already hard enough to keep track of, and doctors bad handwriting on prescriptions makes it even more confusing. A lot of times you get a prescription and dont fully understand what it says. If im allergic to something, I need to know what a meal, menu, or label includes before I eat it. And if im buying something from another country, I should be able to quickly understand what the label or packaging says&lt;/p&gt;

&lt;p&gt;So thats why I built &lt;strong&gt;Bridge&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Bridge is a multilingual AI health companion that helps patients and caregivers setup a health profile, track medicines, upload health related images, and get short structured guidance in a language they can actually understand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsyln2kwnwr7pm4l55le.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpsyln2kwnwr7pm4l55le.png" alt="Home page" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;I wanted to build a health app which was easy to use.&lt;/p&gt;

&lt;p&gt;The goal with Bridge was never to make some doctor replacement, and also not to generate giant AI paragraphs that nobody wants to read. I wanted it to do a few things properly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;help a patient set up the important health details and blockers&lt;/li&gt;
&lt;li&gt;track medicines and dose schedules + reminders&lt;/li&gt;
&lt;li&gt;let users upload health related images like medicines, perscriptions, meals etc..&lt;/li&gt;
&lt;li&gt;turn messy information into short, structured safety guidance&lt;/li&gt;
&lt;li&gt;make the whole thing work in multiple languages&lt;/li&gt;
&lt;li&gt;support voice based onboarding and assistant conversations too&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part matters a lot. In healthcare, small misunderstandings can become big problems very quickly. If someone misses an instruction, takes the wrong medicine at the wrong time, or eats something unsafe because a label was hard to understand, thats not a small UX issue anymore. Thats real.&lt;/p&gt;

&lt;p&gt;One important part here was &lt;strong&gt;lingo.dev&lt;/strong&gt;. I did not want translation to feel like some side feature bolted on later. The app saves the users preferred language early in onboarding, and from there the interface and patient facing content can follow that locale. That means the app can feel more native to the user instead of always feeling like an english first product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Bridge Does
&lt;/h2&gt;

&lt;p&gt;Bridge starts with onboarding. First the user chooses their preferred language. After that, the app collects health context like age, allergies, chronic conditions, dietary restrictions, religious restrictions, and any other notes that matter for safety.&lt;/p&gt;

&lt;p&gt;I also added voice support in onboarding. Users can speak instead of typing everything, and Bridge can speak back too. I liked this part because it makes onboarding feel less like filling a form and more like an actual guided flow.&lt;/p&gt;

&lt;p&gt;Then the app helps the user add medicines and dosing times. Once thats done, the home screen becomes a simple dashboard with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;active medicines&lt;/li&gt;
&lt;li&gt;the next dose&lt;/li&gt;
&lt;li&gt;dose actions like taken, skipped, or snoozed&lt;/li&gt;
&lt;li&gt;progress from recent days&lt;/li&gt;
&lt;li&gt;recent scans&lt;/li&gt;
&lt;li&gt;caregiver access and linked profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgt1gnc8s05u2cdw6g5yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgt1gnc8s05u2cdw6g5yw.png" alt="OnBoarding flow" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The scan flow is the other big part of Bridge.&lt;/p&gt;

&lt;p&gt;Users can upload things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prescriptions&lt;/li&gt;
&lt;li&gt;medicine labels&lt;/li&gt;
&lt;li&gt;food labels&lt;/li&gt;
&lt;li&gt;meal photos&lt;/li&gt;
&lt;li&gt;menus&lt;/li&gt;
&lt;li&gt;other health related images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bridge then runs OCR and AI analysis on the upload. Instead of returning a giant wall of text, it gives a structured result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detected item&lt;/li&gt;
&lt;li&gt;safety status&lt;/li&gt;
&lt;li&gt;why it was flagged&lt;/li&gt;
&lt;li&gt;suggested next action&lt;/li&gt;
&lt;li&gt;confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there are important details like allergens, ingredients, medicine instructions, or profile related conflicts, those get surfaced too. So the output feels more useful and less like "here is a bunch of text good luck".&lt;/p&gt;

&lt;p&gt;This is also where &lt;strong&gt;lingo.dev&lt;/strong&gt; became really useful for me. A user might scan a medicine package from another country, a restaurant menu, or some label they cannot read quickly. Bridge can analyze that and then present the useful result back in the users own language, which is honestly a huge part of the actual value. The important thing is not just "yes we translated it", but that the user can understand what it means for them without doing extra work.&lt;/p&gt;

&lt;p&gt;This is a small part of the localization code I used for patient facing text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;LingoDotDevEngine&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LINGODOTDEV_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sourceLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;normalizedLanguage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks simple, but that simplicity helped a lot. After Bridge figures out the useful result from a scan, I can localize the response into the users language instead of leaving them with english only output.&lt;/p&gt;

&lt;p&gt;And this is the part where the AI scan result gets converted into the users locale after the image is analyzed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;analyzeWithVision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;localizedResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;localizeAnalysisResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preferredLanguage&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;localizedResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vision&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the flow is basically: analyze the image first, get a structured result, and then localize that result back into the users preferred language using &lt;code&gt;lingo.dev&lt;/code&gt;. That was important to me because scanning a foreign package or menu is only useful if the final answer comes back in a language the user can understand quickly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwposmgdc7go3qw898f2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwposmgdc7go3qw898f2d.png" alt="Prescription Scanning" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also added a site AI assistant which supports both speech to text and text to speech. So users can talk to Bridge, ask about medicines, labels, prescriptions, or translations, and hear the answer back in their preferred language. For a health app, I think this makes the whole thing much more accessible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Idea Behind the Product
&lt;/h2&gt;

&lt;p&gt;A patient does not just need another overengineered health app. They need something easier to act on. They need context. They need the app to remember their profile, medicines, and restrictions. They need the result to be short enough that they can understand it quickly, specially on a phone.&lt;/p&gt;

&lt;p&gt;So Bridge is really trying to sit in between raw health information and actual patient action.&lt;/p&gt;

&lt;p&gt;Not replacing doctors or medical professionals. Just helping people not get lost before they even know what they should ask.&lt;/p&gt;

&lt;p&gt;For me, &lt;strong&gt;lingo.dev&lt;/strong&gt; fits into this idea really well because the app is not only translating app text. It also helps Bridge deliver explanations and scan results in the users own locale. So if someone is more comfortable in Hindi, Tamil, Arabic, Spanish, or another supported language, the app can meet them there instead of forcing everything through english first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;I kept the stack pretty practical and modern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;lingo.dev for localization workflow&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Convex for backend&lt;/li&gt;
&lt;li&gt;Better Auth for authentication&lt;/li&gt;
&lt;li&gt;AI SDK with Google Gemini&lt;/li&gt;
&lt;li&gt;Tesseract OCR&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;React Hook Form and Zod&lt;/li&gt;
&lt;li&gt;Serwist for PWA support&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Chose This Stack
&lt;/h2&gt;

&lt;p&gt;I picked &lt;strong&gt;Next.js&lt;/strong&gt; because I'm very familiar with it and can help ship projects fast&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Convex&lt;/strong&gt; for backend because why not&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Auth&lt;/strong&gt; because it is wayy better than clerk&lt;/p&gt;

&lt;p&gt;For AI features i used AI SDK by vercel obviously and gemini models because of the free monthly api limit honestly&lt;/p&gt;

&lt;p&gt;I added &lt;strong&gt;Tesseract OCR&lt;/strong&gt; as part of the image pipeline because not every image is clean, and extracting text is still useful even when the vision analysis is not perfect.&lt;/p&gt;

&lt;p&gt;I also used &lt;strong&gt;lingo.dev&lt;/strong&gt; to localize the whole app + others parts of the app where translation si needed&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Flow Works
&lt;/h2&gt;

&lt;p&gt;The full product flow is pretty straight forward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User signs in&lt;/li&gt;
&lt;li&gt;User selects a preferred language&lt;/li&gt;
&lt;li&gt;User completes onboarding questions&lt;/li&gt;
&lt;li&gt;User adds medicines and dose times&lt;/li&gt;
&lt;li&gt;Home screen shows active tracking and recent activity&lt;/li&gt;
&lt;li&gt;User uploads a health related image&lt;/li&gt;
&lt;li&gt;Bridge analyzes the upload against the patient profile&lt;/li&gt;
&lt;li&gt;User gets short structured guidance&lt;/li&gt;
&lt;li&gt;User can use the assistant with text or voice in their preferred language&lt;/li&gt;
&lt;li&gt;Caregivers can be linked to view and monitor their firends/family health status&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I tried to keep every step simple. This app is meant to be used on phones too, so every screen had to feel light, clear, and direct.&lt;/p&gt;

&lt;p&gt;One thing I learned while building this is that health products get messy very quickly if you over design them too early. I had to keep pulling the app back to the core question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this help the user do the next safe thing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer was no, I tried not to add it. That was harder than I expected honestly but worked for me&lt;/p&gt;

&lt;h2&gt;
  
  
  The Feature I Like Most
&lt;/h2&gt;

&lt;p&gt;My favorite part is honestly two things together, the straight to the point scanning and the care network feature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The scanning part is my favorite because it does not just dump extracted text and leave the user to figure everything out. It tries to give a short useful result. If something looks risky, it says that. If it conflicts with allergies or restrictions, it highlights that. If confidence is low, it says that too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1weyys6fe012hm2cgfk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1weyys6fe012hm2cgfk0.png" alt="Meal Scanning" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Care Network
&lt;/h2&gt;

&lt;p&gt;A lot of people do not manage health stuff alone. It can be parents, grandparents, partners, siblings, or close friends helping each other. That is why I built the care network into Bridge.&lt;/p&gt;

&lt;p&gt;With the care network, a user can connect a trusted person to their profile so they can stay aware of what is going on. That includes things like medicine tracking, recent scans, and general health context. I liked this feature a lot because it makes the app feel more real and useful, not just like another AI tool showing results on a screen.&lt;/p&gt;

&lt;p&gt;To me It adds a human side to the product. Instead of always checking on someone manually or asking the same health questions again and again, a caregiver or loved one can just stay connected and understand what is happening.&lt;/p&gt;

&lt;p&gt;I think that matters a lot, especially for older adults, people recovering from something, or anyone who just does not want to manage everything alone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuw2mcf3u0auh7xrh1lue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuw2mcf3u0auh7xrh1lue.png" alt="Care Network" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;I think multilingual support in healthcare software gets treated like some extra bonus feature a lot of the time. It really is not.&lt;/p&gt;

&lt;p&gt;For many users, language is the difference between independence and confusion.&lt;/p&gt;

&lt;p&gt;If someone can understand their medicine, remember their schedule, share access with a caregiver, and get a simple explanation from a scanned label, that is already meaningful. Even if the app only helps them avoid one mistake, that still matters.&lt;/p&gt;

&lt;p&gt;Bridge is still an early project, but I think the direction is strong because the problem itself is very real.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learnte From Building It
&lt;/h2&gt;

&lt;p&gt;A few things really stood out while building Bridge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structured AI output is much more useful than long generated text&lt;/li&gt;
&lt;li&gt;profile context makes scan analysis way more valuable&lt;/li&gt;
&lt;li&gt;voice support makes onboarding and assistant flows easier for some users&lt;/li&gt;
&lt;li&gt;localization makes it easy for user's who don't speak english natively&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Bridge is my attempt at building a health companion that is multilingual, practical, and actually usable by real people instead of being just another health app&lt;/p&gt;

&lt;p&gt;It helps patients and caregivers set up context, track medicines, scan health related information, and get short structured guidance that would be really helpful to them.&lt;/p&gt;

&lt;p&gt;There is still a lot I want to improve and add but I am happy with the core idea and the direction its going in and might add more updates and functionalities in the future.&lt;/p&gt;

&lt;p&gt;If you want to check it out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/koushikxd/bridge" rel="noopener noreferrer"&gt;https://github.com/koushikxd/bridge&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built for the lingo.dev hackathon.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Lingo Bolt: Removing the Language Barrier From OpenSource</title>
      <dc:creator>Koushikxd</dc:creator>
      <pubDate>Thu, 19 Feb 2026 14:29:10 +0000</pubDate>
      <link>https://forem.com/koushikxd/lingo-bolt-removing-the-language-barrier-from-opensource-4a48</link>
      <guid>https://forem.com/koushikxd/lingo-bolt-removing-the-language-barrier-from-opensource-4a48</guid>
      <description>&lt;p&gt;A few months ago I tried to contribute to a Japanese open source project. The codebase looked interesting, the issues seemed approachable, but everything was in Japanese. The README had a small english section but half the steps were wrong or missing. I spent an hour just trying to get it running locally and eventually gave up.&lt;/p&gt;

&lt;p&gt;I'm a native english speaker. If I had that much trouble, what chance does someone in Brazil or Korea have when they're trying to contribute to a project thats entirely in english?&lt;/p&gt;

&lt;p&gt;That's the problem I wanted to fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Open source is supposed to be for everyone but in practice it runs almost entirely in english. This creates two groups of people who get left out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributors who don't write english well.&lt;/strong&gt; They might be great developers but they can't properly describe their bug, or they can't understand a maintainers review comment well enough to respond. So they stop trying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintainers who get issues in other languages.&lt;/strong&gt; Someone's project gets shared in a Brazilian developer community and suddenly there are 5 issues in Portuguese. The maintainer has no idea what they say so they close them or ignore them.&lt;/p&gt;

&lt;p&gt;Both sides lose. The project loses contributors and the contributors feel unwelcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/koushikxd/lingo-bolt" rel="noopener noreferrer"&gt;Lingo Bolt&lt;/a&gt; is a web app plus a GitHub bot that tries to fix this. You sign in with GitHub, connect a repo, and you get a few tools that let you work with it in any language.&lt;/p&gt;

&lt;h3&gt;
  
  
  The GitHub Bot
&lt;/h3&gt;

&lt;p&gt;This is the main feature and the part that requires zero effort from contributors. You install the lingo-bolt GitHub App on your account or org, configure your default language and thats it. The bot starts listening to your repos through GitHub webhooks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the webhook flow works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When GitHub sends an event to our webhook endpoint, the app verifies the signature and routes it to the right handler. There are three events we care about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;issues.opened         --&amp;gt; new issue was filed
pull_request.opened   --&amp;gt; new PR was opened
issue_comment.created --&amp;gt; someone commented on an issue or PR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auto language detection and labeling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a new issue comes in, the bot uses GPT-4o-mini to detect what language its written in and creates a label like &lt;code&gt;lang:portuguese&lt;/code&gt; or &lt;code&gt;lang:chinese&lt;/code&gt; and applies it to the issue automatically.&lt;/p&gt;

&lt;p&gt;This is useful even without translation. Maintainers can filter issues by language label and at least know what they're dealing with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto translation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If auto-translate is enabled, the bot detects the language of the content and if its different from the maintainer's default language, it translates it and posts a comment with the translated version. It skips posting if the detected language already matches the default, so you don't get noise when issues are already in the right language.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;detectLanguageCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;translated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sourceLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;detected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;postComment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;octokit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;issueNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;`**Auto-translated to &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;defaultLanguage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:**\n\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;translated&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Manual commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beyond the automatic stuff, anyone can trigger the bot manually by mentioning &lt;code&gt;@lingo-bolt&lt;/code&gt; in a comment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@lingo-bolt translate to spanish    --&amp;gt; translates the issue body to Spanish
@lingo-bolt summarize               --&amp;gt; summarizes in the maintainer's default language
@lingo-bolt summarize in french     --&amp;gt; summarizes in French specifically
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The summarize command is really useful for long threads. It uses GPT to write a concise summary of the issue, then if the target language isn't english it translates that summary using Lingo.dev before posting it as a comment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;summary&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateText&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Summarize the following GitHub issue/PR content concisely. Keep it clear and actionable.\n\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;finalText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sourceLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Per-repo overrides&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bot dashboard lets you configure settings at both the installation level and per individual repo. So if you have an org with 10 repos but only want auto-translate on 3 of them, you can set that up without it affecting the rest.&lt;/p&gt;




&lt;h3&gt;
  
  
  RAG Indexing + AI Chat
&lt;/h3&gt;

&lt;p&gt;Once you connect a repo, you can index it. The app clones it, chunks the code, embeds it using &lt;code&gt;text-embedding-3-small&lt;/code&gt;, and stores it in Qdrant. After that you can chat with the repo in any language.&lt;/p&gt;

&lt;p&gt;But its more than just a Q&amp;amp;A bot. The chat has tools that can fetch live data from GitHub — open issues, pull requests, issue details. So you can ask things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"show me open issues that look easy to fix"&lt;/li&gt;
&lt;li&gt;"what does issue #42 need, explain it to me"&lt;/li&gt;
&lt;li&gt;"how does the authentication work in this codebase"&lt;/li&gt;
&lt;li&gt;"where should I start if I want to add dark mode"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And because the chat also has access to the indexed codebase, it can point you to the exact files and functions relevant to whatever issue you're looking at. You ask about an issue, it finds the relevant code, explains whats happening, and tells you where to look.&lt;/p&gt;

&lt;p&gt;For someone who's not confident in english, being able to ask all of this in their own language and get answers that reference actual code in the repo removes two blockers at once: the language barrier and the "i dont know where to start" barrier that most new contributors hit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SUGGESTED_PROMPTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chat.prompt.showOpenIssues&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chat.prompt.recommendEasyIssue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chat.prompt.listOpenPrs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chat.prompt.searchEntryPoint&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  MCP Server (IDE Integration)
&lt;/h3&gt;

&lt;p&gt;This one I'm quite happy with. Lingo Bolt exposes an MCP server so you can use its tools directly inside Cursor, VS Code, or any IDE that supports MCP. No separate build step needed — it runs as a remote HTTP endpoint inside the web app at &lt;code&gt;/api/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add this to &lt;code&gt;opencode/opencode.json&lt;/code&gt; or &lt;code&gt;.cursor/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lingo-bolt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000/api/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can ask your IDE things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Show me open issues for facebook/react in Spanish
Get issue #42 from vercel/next.js in Hindi
Translate the README of expressjs/express to Japanese
Search the codebase of my-org/my-repo for authentication logic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The available tools are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_issues&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List issues with titles translated to your language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_issue&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch a full issue with comments, translated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;translate_doc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Translate any file (README, CONTRIBUTING, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;translate_text&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Translate arbitrary text between languages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_codebase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Semantic search across an indexed repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_onboarding&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fetch AI-generated onboarding docs for a repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;list_issues&lt;/code&gt; and &lt;code&gt;get_issue&lt;/code&gt; tools auto-detect the repo from your current git directory if you don't specify owner/repo. So inside a repo you can just say "show me open issues in Japanese" and it figures out the rest.&lt;/p&gt;

&lt;p&gt;There's also a standalone stdio-based MCP package (&lt;code&gt;packages/mcp&lt;/code&gt;) if you prefer not running the web app. Same tools, same idea, just runs as a local process.&lt;/p&gt;




&lt;h3&gt;
  
  
  AI Onboarding Docs
&lt;/h3&gt;

&lt;p&gt;When you index a repo, the app reads through the codebase using RAG and generates proper onboarding documentation — what the project does, how to set it up, the key concepts. You can then translate those docs into any supported language.&lt;/p&gt;

&lt;p&gt;So a new contributor from Japan can get onboarding docs in Japanese, based on the actual code and not just whatever the original author wrote (or didn't write).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ragResults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;RAG_QUERIES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;queryRepository&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repositoryId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;translated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;accumulated&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sourceLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Markdown Translation
&lt;/h3&gt;

&lt;p&gt;A lot of repos have multiple markdown files beyond just the README — contributing guides, architecture docs, api references. Lingo Bolt clones the repo, finds all the markdown files, and translates the whole set using the Lingo.dev SDK. You can download them individually or as a zip.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Whole App UI is Translated
&lt;/h3&gt;

&lt;p&gt;The app UI adapts to your preferred language. Instead of shipping JSON translation files for every language, all UI strings are stored in english and translated on demand using &lt;code&gt;engine.localizeObject()&lt;/code&gt; from the Lingo.dev SDK. The result is cached so it only fetches once per session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;translated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localizeObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UI_MESSAGES_EN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;sourceLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;targetLocale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means we support 15 languages without maintaining any translation files manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 |
Next.js App
 |
 +-- tRPC routers (repo, bot, user)
 |
 +-- Route handlers
      |
      +-- /api/mcp              --&amp;gt; MCP server (IDE integration)
      +-- /api/repository/index --&amp;gt; clone + embed chunks --&amp;gt; Qdrant
      +-- /api/chat             --&amp;gt; RAG + GitHub tools + GPT stream
      +-- /api/onboarding/generate  --&amp;gt; RAG + GPT stream
      +-- /api/onboarding/translate --&amp;gt; Lingo.dev
      +-- /api/markdown/translate   --&amp;gt; clone + Lingo.dev
      +-- /api/ui/translate         --&amp;gt; Lingo.dev localizeObject
      +-- /api/webhook          --&amp;gt; GitHub App events
           |
           +-- issues.opened        --&amp;gt; auto-label, auto-translate
           +-- pull_request.opened  --&amp;gt; auto-label, auto-translate
           +-- issue_comment.created --&amp;gt; @lingo-bolt command parsing

PostgreSQL (repos, docs, translations, bot installations)
Qdrant (code chunks for semantic search)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How Lingo.dev Is Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;SDK method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub issue/PR translation (bot)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localizeText&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI chat responses&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localizeText&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Onboarding doc translation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localizeText&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown file translation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localizeText&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP tool responses&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localizeText&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI string translation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localizeObject&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Next.js App Router + React 19&lt;/li&gt;
&lt;li&gt;Lingo.dev SDK&lt;/li&gt;
&lt;li&gt;tRPC + TanStack Query&lt;/li&gt;
&lt;li&gt;Better Auth (GitHub OAuth)&lt;/li&gt;
&lt;li&gt;Prisma + PostgreSQL&lt;/li&gt;
&lt;li&gt;Qdrant (vector store)&lt;/li&gt;
&lt;li&gt;OpenAI (gpt-4o-mini + text-embedding-3-small)&lt;/li&gt;
&lt;li&gt;Tailwind CSS + shadcn/ui&lt;/li&gt;
&lt;li&gt;Turborepo + PNPM&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Language shouldn't be the thing that decides who gets to participate in open source. That's really all this is about.&lt;/p&gt;

&lt;p&gt;The project is open source at &lt;a href="https://github.com/koushikxd/lang-bolt" rel="noopener noreferrer"&gt;github.com/koushikxd/lingo-bolt&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>opensource</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
