<?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: Karam</title>
    <description>The latest articles on DEV Community by Karam (@karam999).</description>
    <link>https://dev.to/karam999</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%2F3958619%2F6d59b2de-9cfb-409c-bd6b-93f9d0b75a8b.png</url>
      <title>DEV Community: Karam</title>
      <link>https://dev.to/karam999</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karam999"/>
    <language>en</language>
    <item>
      <title>Transify - real-time chat translation across WhatsApp, Discord, Telegram and more</title>
      <dc:creator>Karam</dc:creator>
      <pubDate>Sun, 07 Jun 2026 16:39:08 +0000</pubDate>
      <link>https://dev.to/karam999/transify-real-time-chat-translation-across-whatsapp-discord-telegram-and-more-1jc7</link>
      <guid>https://dev.to/karam999/transify-real-time-chat-translation-across-whatsapp-discord-telegram-and-more-1jc7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Transify is a Chrome extension that translates chat messages in real time, directly inside messaging platforms like WhatsApp Web, Telegram, Discord, Microsoft Teams, Messenger, and Instagram DMs. You don't copy-paste into Google Translate or switch tabs. The translations happen right there in the chat window.&lt;/p&gt;

&lt;p&gt;The original version was a college mini project I built with two teammates. It worked, but it was held together with duct tape. Plain JavaScript, no build tools, no framework, and it used free translation APIs (MyMemory, LibreTranslate) that gave you basic word-for-word translations with no context awareness.&lt;/p&gt;

&lt;p&gt;The comeback version is a complete rebuild. It now runs on Llama 3.3 70B via Groq for context-aware LLM translations, has a proper Next.js serverless backend, uses the WXT framework for the extension, and everything is in TypeScript. The translations actually sound like a human wrote them now instead of robotic word-for-word output.&lt;/p&gt;

&lt;p&gt;What makes it different from just using Google Translate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It works inline. You double-click a chat bubble, and the translation pops up right there&lt;/li&gt;
&lt;li&gt;It auto-translates both incoming messages and your outgoing text&lt;/li&gt;
&lt;li&gt;You can set tone profiles (Casual, Professional, Empathetic, Playful, Gen Z) and the LLM adjusts the translation style accordingly&lt;/li&gt;
&lt;li&gt;You can control grammatical gender for languages that need it&lt;/li&gt;
&lt;li&gt;You can type inline overrides like &lt;code&gt;hello [playful][female]&lt;/code&gt; to change tone per message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Old repo:&lt;/strong&gt; &lt;a href="https://github.com/Karam-999/Transify--An-extension-for-real-time-chat-translation" rel="noopener noreferrer"&gt;github.com/Karam-999/Transify--An-extension-for-real-time-chat-translation&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;New repo:&lt;/strong&gt; &lt;a href="https://github.com/Karam-999/transify-ai" rel="noopener noreferrer"&gt;github.com/Karam-999/transify-ai&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/SGnF73bE8WY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The extension works across WhatsApp Web, Telegram, Discord, Microsoft Teams, Messenger, and Instagram DMs. You install it, pick your languages and tone, and it starts translating. The video shows the full flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Where it was before:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first version of Transify was a college mini project. It was a Chrome extension built with plain JavaScript, a raw &lt;code&gt;manifest.json&lt;/code&gt;, vanilla HTML/CSS popup, and one big &lt;code&gt;content-full.js&lt;/code&gt; file that did everything. No framework, no build step, no TypeScript.&lt;/p&gt;

&lt;p&gt;For translations, it called free APIs like MyMemory and LibreTranslate. These give you basic machine translation, the kind where "I'm dead serious" might come back as something about death in the target language. No context, no tone awareness, just word-for-word swaps. The auto-detect for source language didn't really work either since MyMemory needs explicit language codes, so we hardcoded &lt;code&gt;en&lt;/code&gt; as fallback.&lt;/p&gt;

&lt;p&gt;It also had some bugs. The error handling would silently return the original text as the "translation" if the API failed, so you'd think it translated but it actually didn't. And since the extension called external APIs directly from content scripts, CORS was a constant headache.&lt;/p&gt;

&lt;p&gt;It worked well enough for the college submission, but it wasn't something you'd actually want to use daily.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in the comeback:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pretty much everything got rebuilt from scratch, but the core idea stayed the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Translation engine:&lt;/strong&gt; Replaced the free translation APIs with Llama 3.3 70B via Groq. This was the biggest upgrade. Instead of word-for-word translations, you now get context-aware translations that understand what you're trying to say. Groq's inference is fast too, usually under 200ms, which matters for real-time chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tone profiles:&lt;/strong&gt; This is the feature I'm most proud of. I built 6 tone profiles (General, Casual, Professional, Empathetic, Playful, Gen Z) with carefully engineered prompts, few-shot examples, and dynamic temperature settings. Each tone has specific instructions for what it should and shouldn't do. The Gen Z profile even has per-language youth slang guides (Hindi uses यार, भाई; Japanese uses やばい, マジ; Korean uses ㅋㅋ, 대박) so it doesn't just shove English slang into other languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Added a proper Next.js serverless backend deployed on Vercel. The extension calls &lt;code&gt;POST /api/translate&lt;/code&gt; instead of hitting translation APIs directly. This solved the CORS issues, keeps the API key server-side, and lets me do prompt engineering on the server without shipping it in the extension code. Also added multi-key Groq fallback so if one API key gets rate-limited, it automatically tries the next one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extension framework:&lt;/strong&gt; Moved from raw &lt;code&gt;manifest.json&lt;/code&gt; + vanilla JS to the WXT framework with TypeScript. WXT handles hot reloading during development, proper build output for Chrome MV3, and environment-based API URL switching (localhost in dev, Vercel in production).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DOM handling:&lt;/strong&gt; The content script has a &lt;code&gt;UniversalTranslator&lt;/code&gt; engine that handles the messy reality of injecting text into modern web apps. WhatsApp, Discord, and Teams all use React with custom input handling (some use Slate.js). You can't just set &lt;code&gt;.value&lt;/code&gt; on an input field since React ignores it. So the engine uses synthetic clipboard pastes and Slate.js event dispatching to actually get the translated text into the input. It also uses MutationObservers to handle SPA navigation, which is critical for Discord and Teams where changing channels doesn't reload the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Added a 100-entry LRU cache so the same message doesn't hit the API twice. If you scroll up in a chat and the same messages are re-rendered, the translations come from cache instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug fixes:&lt;/strong&gt; Fixed the silent error handling where failed translations returned the original text. Now it returns an empty string with an error flag so the UI actually shows something went wrong. Fixed CORS by adding proper headers and an OPTIONS preflight handler on the backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript everywhere:&lt;/strong&gt; The old version was all JavaScript with no type safety. The new version is fully typed. TypeScript interfaces for the Groq API responses, request bodies, tone profiles, the works.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I used Copilot for the repetitive parts of the rebuild.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation and README:&lt;/strong&gt; Copilot helped me write the README for the new repo, the CONTRIBUTING.md, and the setup guides. Writing docs from scratch is tedious and Copilot gave me good first drafts that I cleaned up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript types:&lt;/strong&gt; When I was porting the old JavaScript to TypeScript, Copilot was useful for generating interfaces. Things like the &lt;code&gt;GroqChatResponse&lt;/code&gt;, &lt;code&gt;TranslateRequestBody&lt;/code&gt;, and &lt;code&gt;ToneProfile&lt;/code&gt; types. It picked up on the patterns from the Groq API responses and suggested accurate types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug fixing:&lt;/strong&gt; When I was debugging the CORS issue (extension content scripts can't make cross-origin requests to localhost), Copilot helped me write the CORS header setup and the OPTIONS preflight handler in the Next.js route. It also caught a few TypeScript errors where I was using &lt;code&gt;any&lt;/code&gt; types that should have been properly typed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate:&lt;/strong&gt; The WXT extension setup, the Next.js layout.tsx and page.tsx files, the eslint config. Standard stuff that Copilot autocompleted correctly without me having to look up docs.&lt;/p&gt;

&lt;p&gt;What I wrote myself: all the tone profile prompts and few-shot examples (those need human judgement about what sounds natural), the Gen Z per-language slang guides (I researched actual youth internet culture for each language), the DOM injection logic for React/Slate.js apps (this is tricky platform-specific stuff that Copilot would get wrong), and the LRU cache implementation.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>githubcopilot</category>
      <category>api</category>
    </item>
    <item>
      <title>SpendWise - AI Spend Audit Tool to launch ready App</title>
      <dc:creator>Karam</dc:creator>
      <pubDate>Sun, 07 Jun 2026 15:44:43 +0000</pubDate>
      <link>https://dev.to/karam999/spendwise-ai-spend-audit-tool-33nd</link>
      <guid>https://dev.to/karam999/spendwise-ai-spend-audit-tool-33nd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;SpendWise AI is a free tool that audits your AI tool spending (Cursor, Copilot, Claude, ChatGPT, Gemini, Windsurf) against verified vendor pricing and tells you exactly where you're overspending and what to do about it.&lt;/p&gt;

&lt;p&gt;I originally built this as a week-long assignment for a startup. The problem it solves is simple: founders and engineering managers pay for multiple AI tools but have no idea if they're getting ripped off. SpendWise gives them that answer in under a minute, no signup needed.&lt;/p&gt;

&lt;p&gt;The interesting part is that the core audit engine has zero AI in it. It runs 6 hardcoded rules against verified pricing data, so every recommendation is reproducible and verifiable. AI (Groq's Llama 3) only kicks in to write a friendly summary paragraph on top of the structured results. I made this choice because financial recommendations need to be deterministic. Same input, same output, every time.&lt;/p&gt;

&lt;p&gt;The stack is Next.js 16, TypeScript, Tailwind + shadcn/ui, Supabase for the database, Groq for AI summaries, Resend for emails, and Vitest for testing. Deployed on Vercel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://spendwise-ai-test.vercel.app/" rel="noopener noreferrer"&gt;spendwise-ai-test.vercel.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/Karam-999/SpendWise-AI" rel="noopener noreferrer"&gt;github.com/Karam-999/SpendWise-AI&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The original audit tool:&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/8WYTR5WF3qQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The comeback (re-audit on pricing change):&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/QD8c3kBMcJI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You can try the Round 1 version live at &lt;a href="https://spendwise-ai-test.vercel.app/" rel="noopener noreferrer"&gt;spendwise-ai-test.vercel.app&lt;/a&gt;. Pick a tool like Cursor on Teams plan at $40/mo, run the audit, and see the full savings breakdown. The Round 2 features (pricing change detection, re-audit diff view) are on a separate branch and not merged to main yet, but the demo video above walks through the complete flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Where it was:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The original version was basically a calculator. You fill in your AI tools, it shows you where you can save money, and that's it. If Cursor changed its pricing the next week, your audit was already stale and you'd never know about it.&lt;/p&gt;

&lt;p&gt;It worked fine as a one-time thing. It had the form, the audit engine, AI summaries, email lead capture, shareable URLs with OG tags, localStorage persistence, spam protection, 9 tests, and CI. But audits had no memory. No pricing snapshot, no change detection, no way to bring users back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I added:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I turned it into a system that actually stays useful after the first visit.&lt;/p&gt;

&lt;p&gt;The big changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Every audit now stores the exact pricing data that was used at the time as a snapshot in the database. This way I can always compare what pricing looked like "then" vs "now."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Built a &lt;code&gt;/api/detect-changes&lt;/code&gt; endpoint that accepts pricing overrides, compares them against every stored audit, re-runs the ones that are affected, and sends a consolidated email per user telling them what changed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added a re-audit diff view at &lt;code&gt;/audit/[id]/reaudit&lt;/code&gt; that shows old vs new recommendations side by side, with the savings delta, changed/added/removed recommendations highlighted, and score comparison.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Had to refactor the audit engine to support injectable pricing. The original had pricing hardcoded as a private constant, which was the right call for Round 1 but made Round 2 harder. Ended up exporting the pricing, creating a typed version of the engine that accepts custom pricing, and updating 15 internal references. All 9 original tests still passed after the refactor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wrote 6 new tests for the pricing diff logic. Total is now 15 tests, build and type checking both pass clean.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Things I intentionally skipped: HTML email templates (shipped plain text to get the full flow working instead of polishing one piece), admin dashboard (the data is queryable via SQL already), and scheduled cron (manual endpoint works, Vercel Cron needs Pro tier).&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I used Copilot mostly for the boring stuff that would have eaten up time otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt; was the biggest win. I had a bunch of markdown files to write (architecture docs, PR descriptions, devlogs, reflections) and Copilot helped me get first drafts out fast. I'd review and rewrite them, but not having to start from a blank page saved a lot of time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bug fixing&lt;/strong&gt; was another area where it helped. When Supabase inserts were silently failing (returning null for both data and error because of RLS), Copilot helped me quickly write the diagnostic logging to trace what was happening. It also caught Next.js lint issues like using &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags instead of &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; and setState patterns that were wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TypeScript type checking&lt;/strong&gt; during the Round 2 refactor was where Copilot really earned its keep. I was changing 15 references from a hardcoded &lt;code&gt;PRICING.&lt;/code&gt; to an injected &lt;code&gt;pricing.&lt;/code&gt; parameter and creating new types for the pricing data structure. Copilot's inline suggestions made that mechanical refactoring way faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test scaffolding&lt;/strong&gt; for the 6 new pricing diff tests. Copilot generated the boilerplate (imports, describe/it blocks) and I filled in the actual test logic.&lt;/p&gt;

&lt;p&gt;What I didn't use it for: the actual audit rules (I verified all pricing manually against vendor pages), architectural decisions, and the business/strategy docs. Those need real thinking, not autocomplete.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>ai</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
