<?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>DEV Community: Samar Shetye</title>
    <description>The latest articles on DEV Community by Samar Shetye (@samar_shetye).</description>
    <link>https://dev.to/samar_shetye</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3755023%2F12f019fd-d194-4291-905e-f08c7a96a3dc.jpg</url>
      <title>DEV Community: Samar Shetye</title>
      <link>https://dev.to/samar_shetye</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samar_shetye"/>
    <language>en</language>
    <item>
      <title>CodeMap AI — Helping My Friend Understand Unfamiliar Codebases</title>
      <dc:creator>Samar Shetye</dc:creator>
      <pubDate>Sat, 03 Oct 2026 18:11:25 +0000</pubDate>
      <link>https://dev.to/samar_shetye/codemap-ai-helping-my-friend-understand-unfamiliar-codebases-177d</link>
      <guid>https://dev.to/samar_shetye/codemap-ai-helping-my-friend-understand-unfamiliar-codebases-177d</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;When developers join an unfamiliar project, one of the first challenges is understanding how everything fits together.&lt;br&gt;
You open the repository and see something like:&lt;br&gt;
&lt;code&gt;frontend/&lt;br&gt;
backend/&lt;br&gt;
components/&lt;br&gt;
services/&lt;br&gt;
routes/&lt;br&gt;
controllers/&lt;br&gt;
database/&lt;br&gt;
utils/&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Then the real questions begin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where does the application start?&lt;/li&gt;
&lt;li&gt;Which component calls this API?&lt;/li&gt;
&lt;li&gt;How does data flow from the frontend to the database?&lt;/li&gt;
&lt;li&gt;What files are responsible for authentication?&lt;/li&gt;
&lt;li&gt;If I change this file, what else could be affected?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built CodeMap AI for a friend who was struggling with exactly this problem.&lt;br&gt;
Instead of making them manually explore an unfamiliar repository, CodeMap AI analyzes the project and turns its structure and relationships into an interactive visual codebase map.&lt;br&gt;
I had my friend try CodeMap AI on an unfamiliar project to see whether the visual map and AI explanations actually made the codebase easier to understand.&lt;br&gt;
Using the visual map made it easier for him to understand how the different parts of the project are connected. Instead of opening files one by one, the overall structure could be understood first, followed by the AI explanation for specific parts of the code.&lt;/p&gt;

&lt;p&gt;How it works:&lt;br&gt;
The user provides a project/repository:&lt;br&gt;
GitHub Repository&lt;br&gt;
        ↓&lt;br&gt;
CodeMap AI&lt;br&gt;
        ↓&lt;br&gt;
Code Analysis&lt;br&gt;
        ↓&lt;br&gt;
Dependency &amp;amp; Relationship Detection&lt;br&gt;
        ↓&lt;br&gt;
Interactive Codebase Map&lt;br&gt;
        ↓&lt;br&gt;
AI-powered explanations&lt;/p&gt;

&lt;p&gt;The resulting map lets the user visually explore relationships between different parts of the application.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Youtube video:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/d1Heryv2LY0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;GitHub Repository:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Samar-365" rel="noopener noreferrer"&gt;
        Samar-365
      &lt;/a&gt; / &lt;a href="https://github.com/Samar-365/CodeMap" rel="noopener noreferrer"&gt;
        CodeMap
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      CodeMap AI is an AI-powered application that helps developers understand unfamiliar software projects by automatically analyzing a codebase and generating an interactive visual map of its architecture, components, dependencies, and data flow.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CodeMap AI&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://hacktoberfest.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8ad61ad2998017b6c2ead0ca0903ddacc4da5b3be0dca8113d3847ab36108ebb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362532304275696c64253230666f7225323061253230467269656e642d6f72616e67652e737667" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
&lt;a href="https://github.com/Samar-365/CodeMap/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9833615dcd5c4175da2140bbe363cb42af4faaeffc0624453b6154e68a60d0aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31312b2d626c75652e737667" alt="Python 3.11+"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4045578ca71c45bb003b8dbb693341b821a7396b82c64c226a252011bf36dc50/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d302e3131302b2d3030393638382e737667" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://react.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6f04bb4f91778c6748097e7a9b2ccabdcaa4e36e85649567f7c05aef38d864d5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31382b2d3631444146422e737667" alt="React 18+"&gt;&lt;/a&gt;
&lt;a href="https://ollama.ai/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dde28c879a6ec9d73d9c0c0394c0534e3ac3dea3599a93d66a7cbf386935373e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d4f70656e2d2d576569676874732d707572706c652e737667" alt="Ollama"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An AI-powered visual codebase navigator for understanding unfamiliar projects.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Joining a new engineering team, jumping into an open-source project, or inheriting legacy code often feels overwhelming:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spaghetti Dependencies&lt;/strong&gt;: Developers spend hours or days manually following imports, function definitions, and API calls across dozens of folders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outdated Documentation&lt;/strong&gt;: Architecture diagrams in READMEs or wikis are frequently stale, incomplete, or missing entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fear of Breaking Changes&lt;/strong&gt;: Modifying a utility, route, or model is risky when you cannot clearly visualize all downstream consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy and IP Concerns&lt;/strong&gt;: Sending proprietary codebases to third-party cloud LLMs violates corporate NDAs, security compliance policies, and incurs recurring API costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Solution&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;CodeMap AI&lt;/strong&gt; transforms complex, unfamiliar repositories into an &lt;strong&gt;interactive, multi-tier architectural map&lt;/strong&gt; and provides a &lt;strong&gt;context-grounded local AI assistant&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Multi-Tier Layout&lt;/strong&gt;: Categorizes files into clean architectural layers (&lt;em&gt;Frontend UI&lt;/em&gt;, &lt;em&gt;API Endpoints&lt;/em&gt;, &lt;em&gt;Services&lt;/em&gt;, &lt;em&gt;Data&lt;/em&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Samar-365/CodeMap" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;CodeMap AI combines open-weight AI, local semantic search, and code analysis into one pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Local LLM via Ollama&lt;br&gt;
I use Ollama to run open-weight models entirely on the user's machine. The default model is Gemma 2 (2B) — small enough to run on a laptop CPU, but capable enough to produce clear architectural explanations.&lt;br&gt;
You can swap it for qwen3:4b, llama3.2, or phi4-mini depending on your hardware, all via an environment variable. No API key, no subscription, no cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Semantic Embeddings via SentenceTransformers&lt;br&gt;
Every code chunk is embedded using all-MiniLM-L6-v2 — a lightweight, locally-run embedding model from Hugging Face. These embeddings are indexed in FAISS for sub-millisecond vector search.&lt;br&gt;
When you ask a question, the RAG pipeline retrieves the most semantically relevant code chunks from your repository and injects them directly into the LLM's prompt context, making every answer grounded in your actual codebase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-language Code Analysis&lt;br&gt;
The backend performs multi-language code analysis across Python, JavaScript, TypeScript, JSX/TSX, Java, JSON, YAML, and SQL files using Python's native &lt;code&gt;ast&lt;/code&gt; module for Python code and custom tokenization/parsing logic for other supported file types. It extracts:&lt;br&gt;
Imports and dependencies&lt;br&gt;
Class and function definitions&lt;br&gt;
API route handlers (@app.get, Express routes, etc.)&lt;br&gt;
Frontend network calls (fetch, axios)&lt;br&gt;
Database schema definitions&lt;br&gt;
These are then resolved into a directed dependency graph that feeds both the React Flow visualization and the RAG retrieval pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tech Stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: React 18 + Vite + React Flow (Dagre)&lt;/li&gt;
&lt;li&gt;Backend:  Python 3.11 + FastAPI + Uvicorn&lt;/li&gt;
&lt;li&gt;AST Parsing:  Python ast module + regex tokenizers&lt;/li&gt;
&lt;li&gt;Vector Search:    FAISS + sentence-transformers&lt;/li&gt;
&lt;li&gt;Embeddings:   all-MiniLM-L6-v2 (local, free)&lt;/li&gt;
&lt;li&gt;Local LLM:    Ollama — qwen3:4b, gemma2:2b, llama3.2&lt;/li&gt;
&lt;li&gt;Graph Layout: Dagre (hierarchical DAG algorithm)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;One of the most important aspects of CodeMap AI is that the application deals with source code.&lt;br&gt;
A developer may want to understand a private project, a college project, or an internal codebase. Sending an entire repository to a closed AI service isn't always desirable.&lt;br&gt;
Using open-source/open-weight AI gives the project more flexibility around how the AI is run and where the source code is processed.&lt;br&gt;
For CodeMap AI, this means the system can be designed around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open-weight models&lt;/li&gt;
&lt;li&gt;Local inference&lt;/li&gt;
&lt;li&gt;Self-hosted AI&lt;/li&gt;
&lt;li&gt;Replaceable models&lt;/li&gt;
&lt;li&gt;Greater control over source-code processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't simply to add AI to a developer tool.&lt;br&gt;
The goal is to make AI-based codebase understanding possible while giving developers more control over the models and infrastructure involved.&lt;br&gt;
In my implementation, the AI inference can run locally, meaning the source code doesn't have to be sent to a closed third-party AI provider for analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;Gemma — Best Use of Gemma&lt;br&gt;
I used Gemma, Google's open-weight model, as a core part of CodeMap AI's codebase understanding and AI-powered explanation system.&lt;br&gt;
ElevenLabs — Best Use of ElevenLabs&lt;br&gt;
I used ElevenLabs to generate the voice-over narration for my CodeMap AI demo video.&lt;br&gt;
The voice-over walks through the problem CodeMap AI solves, demonstrates the application's workflow, and explains how the visual codebase map and AI-powered analysis work.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Breaking the Language Barrier When Truth Matters Most</title>
      <dc:creator>Samar Shetye</dc:creator>
      <pubDate>Sun, 15 Mar 2026 20:37:37 +0000</pubDate>
      <link>https://dev.to/samar_shetye/breaking-the-language-barrier-when-truth-matters-most-5b5o</link>
      <guid>https://dev.to/samar_shetye/breaking-the-language-barrier-when-truth-matters-most-5b5o</guid>
      <description>&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%2F3vflnuthwzot6o6tyz11.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%2F3vflnuthwzot6o6tyz11.png" alt=" "&gt;&lt;/a&gt;When global conflicts ignite, the first casualty is often the truth. Local propaganda machines spin narratives, external news sites are blocked, and critical updates from international journalists remain trapped behind a massive barrier: language.&lt;/p&gt;

&lt;p&gt;Before I started coding LingualNews, my "blank canvas" was shaped by this massive information asymmetry. I needed to build a solution using a fast frontend (React/Vite) wrapped around a tight set of APIs (Lingo.dev and Groq) with one core mission: What if anyone, anywhere, could paste a URL from any global news outlet and instantly read—or listen to it—in their native tongue?&lt;/p&gt;

&lt;p&gt;The problem I am solving is access to unfiltered reality. LingualNews makes the world a better place by ensuring that truth is never paywalled by your geographic location or the language you happen to speak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The High-Level Architecture&lt;/strong&gt;&lt;br&gt;
Think of LingualNews as a "Smart Proxy Funnel." You input a foreign news URL. The React client dynamically bypasses CORS constraints through fallback proxies. The raw chaotic HTML is cleaned by a heuristic DOM scraper, stripping away ads and noise. The isolated text is then pushed into a dual-engine AI pipeline: Lingo.dev handles the precise translation, while Groq (LLaMA 3.1) generates concise summaries and acts as a translation fallback. Finally, Native Web Speech APIs vocalize the translated text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the "Magic" Happens&lt;/strong&gt;&lt;br&gt;
The real magic lives in scraperService.js and translationService.js. These modules transform chaotic, unstructured, ad-riddled foreign websites into clean, localized, readable components in milliseconds.&lt;/p&gt;

&lt;p&gt;If I had to isolate the biggest technical breakthrough in the app, it's just a few lines of code in the translation layer. During a geopolitical crisis, traffic spikes. APIs fail. If my primary translation API drops, my app cannot break.&lt;/p&gt;

&lt;p&gt;Here is my breakthrough, explained line-by-line:&lt;/p&gt;

&lt;p&gt;javascript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lingo.dev translation failed, falling back to Groq:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&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="c1"&gt;// Fallback to Groq&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;translateWithGroq&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="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./aiService.js&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;translateWithGroq&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="nx"&gt;targetLang&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;ol&gt;
&lt;li&gt;catch (err): We intercept any failure from the primary Lingo.dev API.&lt;/li&gt;
&lt;li&gt;console.warn(...): Gracefully log the error without crashing the user's interface.&lt;/li&gt;
&lt;li&gt;const { translateWithGroq } = await import(...): This is the secret sauce. Instead of loading the heavy AI service upfront, we dynamically lazy-load the Groq module only if Lingo.dev fails. This keeps the initial bundle size incredibly small and fast.&lt;/li&gt;
&lt;li&gt;return await translateWithGroq(...): We leverage LLaMA 3.1 via Groq to step in as a secondary line of defense, ensuring the user instantly gets their localized news, no matter what.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Most Frustrating Bug&lt;/strong&gt;&lt;br&gt;
My biggest headache? Integrating the official Lingo.dev SDK. It was built for Node environments and threw obscure bundling errors that completely broke the Vite build. The undocumented, obscure fix? I threw away the official SDK entirely. I reverse-engineered their REST endpoint out of their docs and crafted a raw fetch POST request with a custom X-API-Key header. Sometimes, raw HTTP beats a polished SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When Clean Design Met Messy Reality&lt;/strong&gt;&lt;br&gt;
My initial, clean design assumed a simple querySelector('article') would cleanly extract text from any news site perfectly. The reality? Web scraping is a nightmare of custom ad-blockers, captchas, and chaotic div nests.&lt;/p&gt;

&lt;p&gt;My clean design broke immediately. I was forced to write a massive, messy array of heuristic CSS selectors and "noise" filters (.cookie-banner, .advertisement). When all else fails, I built a highly functional workaround: dumping the raw HTML directly into Groq AI with a strict prompt: "Return ONLY the article body text."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical Debt &amp;amp; Trade-Offs&lt;/strong&gt;&lt;br&gt;
To cross the finish line quickly, I accepted a notable piece of technical debt: embedding API keys in the frontend environment (import.meta.env). While Vite obscures them in dev, client-side fetches are risky at scale. I accepted this to launch a fast MVP, knowing I can shift to edge functions in V2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try It Yourself&lt;/strong&gt;&lt;br&gt;
You can run this locally with practically zero friction:&lt;/p&gt;

&lt;p&gt;bash&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/Samar-365/LingualNews
&lt;span class="nb"&gt;cd &lt;/span&gt;LingualNews
npm &lt;span class="nb"&gt;install
&lt;/span&gt;Add your .env with VITE_GROQ_API_KEY and VITE_LINGO_API_KEY
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What’s Next?&lt;/strong&gt;&lt;br&gt;
If you fork this repository today, the most obvious missing piece to build is Offline PWA Support (Service Workers). Reading the news shouldn't require a constant, stable internet connection—especially for users in volatile regions. Local caching features could dramatically improve this app's life-saving potential.&lt;/p&gt;

&lt;p&gt;Code is more than syntax; it's how we connect the world. What are you building today?&lt;/p&gt;

&lt;p&gt;Check out the repo at &lt;a href="https://github.com/Samar-365/LingualNews" rel="noopener noreferrer"&gt;https://github.com/Samar-365/LingualNews&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/sumitsaurabh927"&gt;@sumitsaurabh927&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/maxprilutskiy"&gt;@maxprilutskiy&lt;/a&gt; for their continuous guidance throughout the hackathon and also for providing us this great opportunity.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>lingodotdev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Stop Copy-Pasting from Images: Build a Universal Screen Translator with Python</title>
      <dc:creator>Samar Shetye</dc:creator>
      <pubDate>Thu, 05 Feb 2026 18:33:50 +0000</pubDate>
      <link>https://dev.to/samar_shetye/stop-copy-pasting-from-images-build-a-universal-screen-translator-with-python-54gm</link>
      <guid>https://dev.to/samar_shetye/stop-copy-pasting-from-images-build-a-universal-screen-translator-with-python-54gm</guid>
      <description>&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%2F5wmxocgu79vtbsp75oh7.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%2F5wmxocgu79vtbsp75oh7.png" alt=" " width="750" height="275"&gt;&lt;/a&gt;&lt;strong&gt;Lingo-Live&lt;/strong&gt; started with a frustration I’m sure you’ve felt too.&lt;/p&gt;

&lt;p&gt;Have you ever tried copying text from a YouTube video?&lt;br&gt;
Or translating a Japanese error message inside a game?&lt;/p&gt;

&lt;p&gt;Yeah. You can’t.&lt;br&gt;
Because it’s not text — it’s just pixels.&lt;/p&gt;

&lt;p&gt;Most of us end up doing one of two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;painfully typing everything by hand, or&lt;/li&gt;
&lt;li&gt;pulling out our phones and using Google Lens, holding it up to the screen like it’s 2010.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s clunky. It breaks focus. And honestly, we can do better.&lt;/p&gt;

&lt;p&gt;So I built Lingo-Live — a sleek desktop app that lets you translate anything you see on your screen instantly.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Superpower We Wanted
&lt;/h2&gt;

&lt;p&gt;I didn’t want just another translation app. I wanted something that felt like a superpower.&lt;/p&gt;
&lt;h2&gt;
  
  
  That meant it had to be:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Invisible – runs quietly in the background&lt;/li&gt;
&lt;li&gt;Instant – hit a hotkey, select an area, get a translation&lt;/li&gt;
&lt;li&gt;Modern – glassy UI, dark mode, blur effects, no Windows-95 vibes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Press Ctrl + Alt + T, drag over any part of your screen, and boom — translated text appears on top of whatever you’re doing.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Secret Sauce: How Lingo-Live Works
&lt;/h2&gt;

&lt;p&gt;Python made this possible. It’s basically a Swiss Army knife for building tools like this.&lt;/p&gt;

&lt;p&gt;Here’s how everything comes together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The “Glass” Overlay&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The trickiest part was creating a window that stays on top without being annoying.&lt;/p&gt;

&lt;p&gt;I used CustomTkinter to build a frameless, translucent overlay that feels light and modern.&lt;/p&gt;

&lt;p&gt;Key details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always on top so translations stay visible&lt;/li&gt;
&lt;li&gt;Semi-transparent so you can still see context underneath&lt;/li&gt;
&lt;li&gt;Frameless — no ugly title bar; custom drag-and-drop instead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result feels less like an app and more like a layer on your desktop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Eyes (OCR)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you trigger the hotkey, Lingo-Live doesn’t try to “read the screen.”&lt;/p&gt;

&lt;p&gt;Instead, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lets you select a region&lt;/li&gt;
&lt;li&gt;Takes a screenshot of just that area&lt;/li&gt;
&lt;li&gt;Sends it to Tesseract OCR to extract text from the pixels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conceptually, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;screenshot = ImageGrab.grab(bbox=(x1, y1, x2, y2))
text = ocr_engine.extract_text(screenshot)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s where the magic starts — turning images into actual text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Brain (Translation)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once OCR gives us something like こんにちは, we need a translation that actually makes sense.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Lingo.dev&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Instead of raw dictionary swaps, it handles context properly, which makes a huge difference — especially for UI text, error messages, and game dialogue.&lt;/p&gt;

&lt;p&gt;The result feels natural, not robotic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The Voice (Text-to-Speech)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes you don’t want to read. You just want to hear it.&lt;/p&gt;

&lt;p&gt;So I added Edge TTS, which uses the same high-quality voices found in Microsoft Edge.&lt;/p&gt;

&lt;p&gt;Now Lingo-Live can read translations out loud — great for pronunciation or just staying hands-free.&lt;/p&gt;

&lt;p&gt;“Fish are vertebrate animals that live in water…” &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Leveling Up: AI Summarization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full translations are great, but sometimes you just want the gist.&lt;/p&gt;

&lt;p&gt;So I added a Summarize button powered by Google Gemini.&lt;/p&gt;

&lt;p&gt;Here’s what happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The translated text is sent to Gemini&lt;/li&gt;
&lt;li&gt;It returns a clean, one-sentence summary&lt;/li&gt;
&lt;li&gt;You get the point instantly
Perfect for skimming foreign articles, long error messages, or RPG dialogue dumps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. Make It Yours: Settings That Actually Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn’t want Lingo-Live to feel rigid, so I built a full settings system backed by JSON.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;p&gt;[- Change the hotkey (Alt + Z? Sure.)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switch themes (dark mode is the correct choice)&lt;/li&gt;
&lt;li&gt;Pick different fonts (Roboto &amp;gt; Segoe UI, fight me)](url)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best part?&lt;br&gt;
All changes apply instantly — no restarts, no reloads. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building your own tools is one of the most satisfying parts of being a developer.&lt;/p&gt;

&lt;p&gt;Lingo-Live solves a problem I run into constantly: text that’s trapped inside images, videos, and games. Instead of working around it, I built something that feels fast, modern, and genuinely useful.&lt;/p&gt;

&lt;p&gt;If you’ve ever rage-typed a foreign error message at 2 AM, this app is for you.&lt;/p&gt;

&lt;p&gt;Lingo.dev makes localization feel effortless—turning a painful, error-prone task into a smooth, developer-friendly experience.&lt;/p&gt;

&lt;p&gt;Check out the repo at &lt;a href="https://github.com/Samar-365/lingo_live" rel="noopener noreferrer"&gt;https://github.com/Samar-365/lingo_live&lt;/a&gt;, clone the code, and stop copy-pasting from pixels.&lt;/p&gt;

&lt;p&gt;Special thanks to &lt;a class="mentioned-user" href="https://dev.to/sumitsaurabh927"&gt;@sumitsaurabh927&lt;/a&gt; and &lt;a class="mentioned-user" href="https://dev.to/maxprilutskiy"&gt;@maxprilutskiy&lt;/a&gt; for their continuous guidance throughout the hackathon and also for providing us this great opportunity.&lt;/p&gt;

&lt;p&gt;Happy coding! &lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>python</category>
      <category>lingodotdev</category>
    </item>
  </channel>
</rss>
