<?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: Mahmud Rahman</title>
    <description>The latest articles on Forem by Mahmud Rahman (@mahmud-r-farhan).</description>
    <link>https://forem.com/mahmud-r-farhan</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%2F2119935%2F08a7e3c9-cc06-43e3-ac8a-a80050bcca6e.jpg</url>
      <title>Forem: Mahmud Rahman</title>
      <link>https://forem.com/mahmud-r-farhan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mahmud-r-farhan"/>
    <language>en</language>
    <item>
      <title>Compare DocQR Tools to CamScanner</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Mon, 23 Mar 2026 05:22:53 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/compare-docqr-tools-to-camscanner-21kp</link>
      <guid>https://forem.com/mahmud-r-farhan/compare-docqr-tools-to-camscanner-21kp</guid>
      <description>&lt;p&gt;&lt;strong&gt;DocQR Tools&lt;/strong&gt; and &lt;strong&gt;CamScanner&lt;/strong&gt; are both Android apps that handle document-related tasks (especially scanning and PDF creation), but they target quite different user needs and philosophies in 2026.&lt;/p&gt;

&lt;p&gt;Here's a clear side-by-side comparison based on their current positioning, features, and approach:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;DocQR Tools (by Bengal Bytes, launched ~March 2026)&lt;/th&gt;
&lt;th&gt;CamScanner (IntSig / established leader)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Focus&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All-in-one lightweight utility suite (17–24+ tools)&lt;/td&gt;
&lt;td&gt;Professional-grade &lt;strong&gt;document scanning&lt;/strong&gt; + PDF management + OCR ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core Scanning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic document → PDF via image import (gallery-based, quick multi-image to PDF)&lt;/td&gt;
&lt;td&gt;Advanced camera scanning: edge detection, perspective correction, filters, batch mode, auto-capture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PDF Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Image → PDF, basic creation/compression, possibly merge/split in pro version&lt;/td&gt;
&lt;td&gt;Full PDF editing suite: annotate, sign, rearrange pages, compress, encrypt, convert (PDF ↔ Word/Excel/PPT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCR (Text Recognition)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not prominently featured (likely absent or very basic if present)&lt;/td&gt;
&lt;td&gt;Strong built-in OCR: extract text accurately, searchable PDFs, multi-language support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QR / Barcode Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Excellent: fast QR/barcode scanner, generator (custom QR, vCard, Wi-Fi, multiple barcode types like Code 128, UPC, EAN, PDF417)&lt;/td&gt;
&lt;td&gt;Basic QR scanning (more of a side feature, not a focus)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Other Utilities&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Calculator, notes, timer, password generator, invoice generator, unit converter, teleprompter, task breaker, image compressor, timezone converter, SEO tags (pro), etc. — true multi-tool app&lt;/td&gt;
&lt;td&gt;Mostly document-centric: ID photo maker, some cloud sync, collaboration links, desktop companion app with offline editing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offline Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100% offline for almost all tools (big selling point)&lt;/td&gt;
&lt;td&gt;Good offline scanning/editing, but many advanced features (OCR, conversion, sync) benefit from or require cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ads &amp;amp; Monetization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Appears mostly free with minimal/no intrusive ads mentioned; possible pro upgrade for extra tools&lt;/td&gt;
&lt;td&gt;Free version has heavy ads; premium subscription removes ads + unlocks full features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Privacy &amp;amp; Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Emphasizes privacy-focused, offline-first design&lt;/td&gt;
&lt;td&gt;History of privacy concerns (2019 malware incident); now stresses security but still cloud-reliant for many features&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Size &amp;amp; Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lightweight, fast, modern UI (Flutter-based, dark mode)&lt;/td&gt;
&lt;td&gt;Larger app, more feature-heavy, can feel busier/cluttered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;People who want one app for everyday utilities + occasional quick scans &amp;amp; strong QR needs&lt;/td&gt;
&lt;td&gt;Professionals, students, businesses needing high-quality scans, editable PDFs, OCR, and cross-device workflows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maturity &amp;amp; Downloads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very new (~10+ downloads shortly after launch, early promotion phase)&lt;/td&gt;
&lt;td&gt;Mature product, tens/hundreds of millions of installs historically, well-known brand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Replacing 5–10 small utility apps, QR-heavy workflows, privacy-conscious users who want simplicity&lt;/td&gt;
&lt;td&gt;Serious document digitization, needing clean scans from camera, text extraction, PDF editing on mobile/desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Quick Verdict
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;DocQR Tools&lt;/strong&gt; if you're tired of 10+ separate tiny apps and want a clean, offline, modern Swiss-army-knife toolset where QR/barcode handling + basic PDF creation is enough. It's especially appealing if privacy, speed, and not dealing with ads matter a lot to you. (And yes — the developer is actively promoting it right now!)&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;CamScanner&lt;/strong&gt; if document scanning is your main/daily need: you photograph a lot of paper, want polished results with automatic enhancements, need searchable text via OCR, or require advanced PDF editing/conversion features. It's more mature and powerful in the pure scanning domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: DocQR Tools is the &lt;strong&gt;broad multi-tool&lt;/strong&gt;, while CamScanner remains the &lt;strong&gt;specialized scanning powerhouse&lt;/strong&gt;. If your primary pain point is fragmented utility apps rather than professional-grade document scanning, DocQR Tools could be a refreshing lightweight alternative in 2026.&lt;/p&gt;

&lt;p&gt;Try Now: &lt;a href="https://play.google.com/store/apps/details?id=com.bengalbytes.docqr_tools" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.bengalbytes.docqr_tools&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>app</category>
      <category>help</category>
      <category>utility</category>
    </item>
    <item>
      <title>From Idea to Play Store: The Unfiltered Guide to Publishing Your First App (AdMob included!)</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Tue, 17 Mar 2026 11:36:52 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/from-idea-to-play-store-the-unfiltered-guide-to-publishing-your-first-app-admob-included-5hbd</link>
      <guid>https://forem.com/mahmud-r-farhan/from-idea-to-play-store-the-unfiltered-guide-to-publishing-your-first-app-admob-included-5hbd</guid>
      <description>&lt;p&gt;You have a fantastic idea and the coding skills to bring it to life, but the journey from executing &lt;code&gt;flutter create&lt;/code&gt; to launching a live app on the Google Play Store can be challenging. Recently, I deployed my first app, &lt;strong&gt;DocQR Tools&lt;/strong&gt;, an all-in-one utility kit, and the experience taught me valuable lessons that you won't easily find in the official documentation.&lt;/p&gt;

&lt;p&gt;Here is the real, unfiltered guide for solo developers to build, monetize, and publish their first app.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Build: Focus on the MVP
&lt;/h3&gt;

&lt;p&gt;Don't fall into feature creep. For DocQR Tools, I wanted a QR scanner, a smart calculator, and various utilities. I focused strictly on core functionality and keeping the app lightweight (especially optimizing for low-end devices).&lt;br&gt;
&lt;strong&gt;💡 Pro-tip:&lt;/strong&gt; Constantly test on a physical Android device, not just the emulator.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Monetisation: Adding AdMob the Right Way
&lt;/h3&gt;

&lt;p&gt;Everyone wants to earn from their hard work, but AdMob can be tricky for beginners.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; Don't spam ads. Place banner ads at the absolute bottom or top where they don't block UI interactions. Use Interstitial ads only between distinct page transitions. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Hidden Trap:&lt;/strong&gt; ALWAYS use AdMob test IDs during development. If you use real ad units and click them by mistake while testing, your account can be suspended for invalid traffic before you even launch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Closed Testing Marathon
&lt;/h3&gt;

&lt;p&gt;Google Play now requires new personal accounts to run a closed test with 20 opt-in testers for 14 continuous days.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Reality:&lt;/strong&gt; Getting 12/20 people to opt-in daily is hard. Use communities on Reddit (like r/AndroidClosedTesting), Discord, or Facebook to find fellow developers willing to swap testing limits. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engage:&lt;/strong&gt; Actually collect their feedback. When applying for production access, Google will ask &lt;em&gt;exactly&lt;/em&gt; how you gathered and implemented feedback. Have a changelog ready!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Navigating the Play Console Labyrinth
&lt;/h3&gt;

&lt;p&gt;When preparing the release, the policy declarations can feel overwhelming.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data Safety:&lt;/strong&gt; Be painfully honest. If you use a third-party SDK (like AdMob), you are technically collecting diagnostic and device ID data. You must declare it!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Configurations:&lt;/strong&gt; Android is moving towards 16 KB memory page sizes. Ensure your NDK, Flutter versions, and build configurations are updated to avoid future release restrictions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Pressing 'Publish'
&lt;/h3&gt;

&lt;p&gt;Submit your app for review. It can take up to 7 days for a new app. Don't panic if it sits in "In Review" status for days. That is completely normal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Creating and launching DocQR Tools has been quite a journey, but witnessing real users download it makes every late-night debugging session worthwhile. To all new developers: keep pushing forward, respect the process, and celebrate the small victories!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.bengalbytes.docqr_tools" rel="noopener noreferrer"&gt;&lt;br&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.postimg.cc%2FQdLGGgZc%2Fapp-icon.png" alt="DocQR Tools Icon" width="512" height="512"&gt;&lt;br&gt;
  &lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;DocQR Tools&lt;/h2&gt;


&lt;p&gt;&lt;br&gt;
    17 powerful tools in one app! PDF creator, QR scanner, calculator, notes, timer &amp;amp; more.&lt;br&gt;&lt;br&gt;
    &lt;b&gt;Beautiful design • Dark mode • 100% Free&lt;/b&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.bengalbytes.docqr_tools" rel="noopener noreferrer"&gt;&lt;br&gt;
    &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay.google.com%2Fintl%2Fen_us%2Fbadges%2Fstatic%2Fimages%2Fbadges%2Fen_badge_web_generic.png" alt="Get it on Google Play" width="646" height="250"&gt;&lt;br&gt;
  &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give my app a try and put it to the test! Your feedback is invaluable, and I'm excited to see what you think!&lt;/p&gt;

</description>
      <category>android</category>
      <category>admob</category>
      <category>appdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>Seeking Mutual Support for Android Closed Testing</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Tue, 03 Mar 2026 17:36:45 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/seeking-mutual-support-for-android-closed-testing-3n7p</link>
      <guid>https://forem.com/mahmud-r-farhan/seeking-mutual-support-for-android-closed-testing-3n7p</guid>
      <description>&lt;p&gt;Help Needed: 12 Testers for Google Play Closed Testing (14 Days) 🚀&lt;/p&gt;

&lt;p&gt;Hi everyone,&lt;/p&gt;

&lt;p&gt;I’m in the final stage of launching a new Android app on the Google Play Store. To meet current production access requirements, I need 12 testers to participate in a 14-day closed testing phase.&lt;/p&gt;

&lt;p&gt;Finding 12 out of 20 consistent testers can be challenging for independent developers, so I’m proposing a "Test-for-Test" collaboration.&lt;/p&gt;

&lt;p&gt;Here’s how we can help each other:&lt;br&gt;
If you have an app currently in testing, I will gladly test yours in return. I’ll keep your app installed for the full 14 days and provide any feedback you need.&lt;/p&gt;

&lt;p&gt;Let’s create a small support circle to help each other get our apps live. If you’re a fellow developer in a similar situation or someone willing to assist a developer, please comment below or send me a direct message. I’ll share the Google Group and opt-in links with you.&lt;/p&gt;

&lt;p&gt;Let's support each other and grow together!&lt;/p&gt;

&lt;p&gt;Join: &lt;a href="https://groups.google.com/g/playconsole-closed-testing" rel="noopener noreferrer"&gt;https://groups.google.com/g/playconsole-closed-testing&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>testing</category>
      <category>development</category>
      <category>appdev</category>
    </item>
    <item>
      <title>I Built an AI Reply, Enhance &amp; Translate Assistant, Browser Extension + Web App + Mobile (Open Source)</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Wed, 18 Feb 2026 15:57:23 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/i-built-an-ai-reply-enhance-translate-assistant-browser-extension-web-app-mobile-open-1o4a</link>
      <guid>https://forem.com/mahmud-r-farhan/i-built-an-ai-reply-enhance-translate-assistant-browser-extension-web-app-mobile-open-1o4a</guid>
      <description>&lt;h1&gt;
  
  
  I Built an AI Reply, Enhance &amp;amp; Translate Assistant, Browser Extension + Web App + Mobile (Open Source)
&lt;/h1&gt;

&lt;p&gt;Most developers have, at some point, written the same reply template for the tenth time that week. Or slowly rewritten a perfectly fine email into something that sounds more professional. Or copied text into Google Translate, copied the output back, and wondered why this is still a manual process in 2025.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Reply, Enhance &amp;amp; Translate&lt;/strong&gt; is a full-stack AI tool suite — a browser extension, a React web app, and a Flutter mobile app — all backed by a single Node.js server that talks to LLMs via OpenRouter. The whole project is open source, and this post is a walkthrough of what it does, how it's built, and why I made some of the architectural decisions I did.&lt;/p&gt;




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

&lt;p&gt;The project has three modes, each available across all three client interfaces:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Reply&lt;/strong&gt; — you paste a message you've received, and the tool generates 4 context-aware reply suggestions. Useful for support tickets, emails, DMs, anything where you're responding to someone else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Enhance&lt;/strong&gt; — you paste your own draft text and get 4 improved variations. Think grammar correction, better clarity, tighter structure, more natural flow. Like Grammarly, but generating alternatives instead of correcting inline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart Translate&lt;/strong&gt; — paste text, pick a target language, and get 4 translated variations in your chosen tone. The tool supports English, Spanish, French, German, Chinese, Arabic, Bengali, and more.&lt;/p&gt;

&lt;p&gt;For all three modes, you can pick from 6 response formats: &lt;strong&gt;Professional&lt;/strong&gt;, &lt;strong&gt;Friendly&lt;/strong&gt;, &lt;strong&gt;Casual&lt;/strong&gt;, &lt;strong&gt;Formal&lt;/strong&gt;, &lt;strong&gt;Flirty&lt;/strong&gt;, and &lt;strong&gt;Romantic&lt;/strong&gt;. Each one changes not just vocabulary but the entire register and feel of the output.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;smart-reply/
├── backend/           # Node.js + Express — the shared API layer
├── extension/         # Chrome/Firefox (Manifest V3) — vanilla JS
├── frontend/          # React + Zustand + Tailwind + Framer Motion
└── smart_reply_app/   # Flutter + Provider — Android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three clients, one backend. Every client hits the same three endpoints, and the backend handles model selection, prompt construction, caching, and response formatting.&lt;/p&gt;

&lt;p&gt;This was an intentional decision. I didn't want three separate AI integrations to maintain. The backend owns all the LLM logic, and the clients stay thin.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Backend
&lt;/h2&gt;

&lt;p&gt;The Express server exposes three endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/suggest-reply     — Smart Reply mode
POST /api/enhance-text      — Smart Enhance mode
POST /api/translate-text    — Smart Translate mode
GET  /health                — Health check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each endpoint receives a text payload and a format string, constructs a structured prompt, calls OpenRouter, and returns an array of suggestions/enhancements/translations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Selection Strategy
&lt;/h3&gt;

&lt;p&gt;One thing I wanted to avoid was routing every request to the same model. Different operations benefit from different model strengths. In v0.4, the backend selects from a priority-ordered list of free OpenRouter models per operation type:&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="c1"&gt;// Simplified — actual implementation uses a weighted selector&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;suggest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xiaomi/mimo-v2-flash:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tngtech/deepseek-r1t2-chimera:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai/gpt-oss-20b:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;enhance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tngtech/deepseek-r1t2-chimera:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xiaomi/mimo-v2-flash:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai/gpt-oss-20b:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai/gpt-oss-20b:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xiaomi/mimo-v2-flash:free&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tngtech/deepseek-r1t2-chimera:free&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;p&gt;The system is LLM-agnostic. If you have a paid OpenRouter key, you can swap in any model you want. The backend doesn't care.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Caching System (v0.4)
&lt;/h2&gt;

&lt;p&gt;This was the most meaningful engineering work in v0.4. Before it, every request hit OpenRouter — even if the user had just asked the exact same question 30 seconds ago.&lt;/p&gt;

&lt;p&gt;The new caching layer uses &lt;strong&gt;SHA256 hashing&lt;/strong&gt; to generate collision-resistant cache keys from the full prompt + model identifier. Entries expire after 5 minutes (TTL).&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cacheKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;modelId&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;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&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="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// instant response&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;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;callOpenRouter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;modelId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cacheKey&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&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;Why SHA256 and not just a string hash?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Simple string hashing produces collisions at scale. Two different prompts can generate the same hash, which means one user gets another user's cached response. SHA256 eliminates this entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results from v0.4:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API Cache Hits&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;~60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response Size&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;~32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache Key Collisions&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;React Re-renders&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;−40–50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zombie Requests&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;td&gt;Eliminated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Browser Extension
&lt;/h2&gt;

&lt;p&gt;The extension uses &lt;strong&gt;Manifest V3&lt;/strong&gt; with vanilla JavaScript — no framework. This was deliberate. Extensions need to be small, fast, and predictable. A React bundle in an extension popup is overkill and adds startup latency.&lt;/p&gt;

&lt;p&gt;Key extension features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct text injection&lt;/strong&gt; — click a suggestion and it inserts directly into the active text field (email composer, chat input, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context menu integration&lt;/strong&gt; — right-click selected text to translate it instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcut&lt;/strong&gt; — &lt;code&gt;Ctrl+Shift+T&lt;/code&gt; triggers the translation flow without opening the popup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-detection&lt;/strong&gt; — the extension detects selected text on the page and pre-populates the input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extension communicates with the backend via the user-configured API URL, stored in &lt;code&gt;chrome.storage.sync&lt;/code&gt;. This means settings persist across devices when signed into Chrome.&lt;/p&gt;




&lt;h2&gt;
  
  
  The React Web App
&lt;/h2&gt;

&lt;p&gt;The web frontend uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; for the component tree&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zustand&lt;/strong&gt; for state management — lightweight, no boilerplate, perfect for this scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling — utility-first, consistent, fast to iterate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion&lt;/strong&gt; for animations — the mode-switching transition and result card animations make the experience feel polished&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lucide React&lt;/strong&gt; for icons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One detail I spent time on: the textarea auto-resizes as you type. It sounds trivial but it matters for long inputs — a fixed-height box that scrolls feels unfinished.&lt;/p&gt;

&lt;p&gt;Keyboard shortcut &lt;code&gt;Ctrl/Cmd + Enter&lt;/code&gt; submits the form, which keeps the interaction flow close to how developers already work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Flutter Mobile App
&lt;/h2&gt;

&lt;p&gt;The mobile app uses Flutter with Provider for state management. It hits the same backend endpoints, so every feature available on web is available on mobile.&lt;/p&gt;

&lt;p&gt;One configuration note: Android Emulators use &lt;code&gt;10.0.2.2&lt;/code&gt; to refer to the host machine's localhost. Physical devices need the actual LAN IP of your dev machine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/utils/constants.dart&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'http://10.0.2.2:5006/api'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// emulator&lt;/span&gt;
&lt;span class="c1"&gt;// const String baseUrl = 'http://192.168.1.X:5006/api'; // physical device&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Running It Locally
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend (Option A — local):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;backend
&lt;span class="c"&gt;# Create .env with OPENROUTER_API_KEY and PORT=5006&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Backend (Option B — Docker):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; smart-reply-backend ./backend
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 5006:5006 &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key smart-reply-backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Web frontend:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;frontend
&lt;span class="c"&gt;# Create .env with VITE_API_ENDPOINT=http://localhost:5006/api&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Browser extension:&lt;/strong&gt; Load unpacked from &lt;code&gt;chrome://extensions&lt;/code&gt; → select the &lt;code&gt;extension/&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flutter app:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;smart_reply_app
flutter pub get &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; flutter run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  API Quick Reference
&lt;/h2&gt;

&lt;p&gt;All endpoints accept JSON and return arrays of suggestions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Smart Reply&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:5006/api/suggest-reply &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message": "Can we push the deadline?", "format": "professional"}'&lt;/span&gt;

&lt;span class="c"&gt;# Smart Enhance&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:5006/api/enhance-text &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "plz fix the bug its urgent", "format": "professional"}'&lt;/span&gt;

&lt;span class="c"&gt;# Smart Translate&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:5006/api/translate-text &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "Good morning!", "format": "friendly", "language": "spanish"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Security (v0.4 Additions)
&lt;/h2&gt;

&lt;p&gt;A few security hardening steps went in with v0.4 that are worth calling out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security headers&lt;/strong&gt; — XSS protection, X-Frame-Options (clickjacking prevention), Content-Type enforcement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strict input validation&lt;/strong&gt; — all inputs are validated server-side before being passed to the LLM prompt&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request cancellation&lt;/strong&gt; — in-flight requests are cancelled when a new request comes in, preventing race conditions and stale responses ("zombie requests")&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;A few things I'm thinking about for future versions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming responses — returning suggestions one by one as they generate rather than waiting for the full array&lt;/li&gt;
&lt;li&gt;A history panel in the web app — saved past suggestions with search&lt;/li&gt;
&lt;li&gt;Firefox extension compatibility improvements (Manifest V3 support in Firefox is still a bit fragile)&lt;/li&gt;
&lt;li&gt;More languages for translation&lt;/li&gt;
&lt;li&gt;A Claude / Gemini / local model option alongside OpenRouter&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;This is fully open source and contributions are welcome. The codebase is clean and reasonably well-organized, and the README covers everything you need to get started.&lt;/p&gt;

&lt;p&gt;If you find a bug, want to add a language, improve the caching logic, or build out a new client, open an issue or a PR.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/mahmud-r-farhan/smart-reply" rel="noopener noreferrer"&gt;github.com/mahmud-r-farhan/smart-reply&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🌐 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://smart-reply-delta.vercel.app" rel="noopener noreferrer"&gt;smart-reply-delta.vercel.app&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;The most satisfying tools to build are the ones that remove friction from things you do every day. This project isn't trying to be a platform. It's trying to be genuinely useful in the 30 seconds you spend writing a reply you've written before.&lt;/p&gt;

&lt;p&gt;If you find it useful, a ⭐ on GitHub goes a long way.&lt;/p&gt;

&lt;p&gt;And if you've built something similar or have ideas for where this could go, drop a comment. I read them all.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mobile</category>
      <category>node</category>
      <category>ai</category>
    </item>
    <item>
      <title>Hogo: Ignite Your Node.js Performance with Atomic Request Coalescing</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Mon, 12 Jan 2026 14:35:26 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/hogo-ignite-your-nodejs-performance-with-atomic-request-coalescing-5gci</link>
      <guid>https://forem.com/mahmud-r-farhan/hogo-ignite-your-nodejs-performance-with-atomic-request-coalescing-5gci</guid>
      <description>&lt;h3&gt;
  
  
  The "Thundering Herd" Problem
&lt;/h3&gt;

&lt;p&gt;We've all been there. You have an expensive endpoint—maybe a complex database aggregation or a third-party API call. It takes 500ms to execute.&lt;/p&gt;

&lt;p&gt;Suddenly, &lt;strong&gt;100 users&lt;/strong&gt; hit that endpoint at the exact same moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without Hogo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ❌ Your database gets hammered with 100 simultaneous queries.&lt;/li&gt;
&lt;li&gt;  ❌ Your event loop lags.&lt;/li&gt;
&lt;li&gt;  ❌ Memory usage spikes as 100 response objects are buffered.&lt;/li&gt;
&lt;li&gt;  ❌ Users wait 500ms + overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Enter Hogo 🛡️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://npmjs.com/package/hogo" rel="noopener noreferrer"&gt;Hogo&lt;/a&gt; is a new zero-dependency Node.js framework that implements the &lt;strong&gt;SingleFlight&lt;/strong&gt; pattern (made famous by Go) directly into its core.&lt;/p&gt;

&lt;p&gt;It uses &lt;strong&gt;Atomic Coalescing&lt;/strong&gt; to manage concurrent identical requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Hogo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ✅ &lt;strong&gt;1 database query&lt;/strong&gt; executes.&lt;/li&gt;
&lt;li&gt;  ✅ &lt;strong&gt;99 requests&lt;/strong&gt; "wait" for the result of the first one.&lt;/li&gt;
&lt;li&gt;  ✅ All 100 users get the &lt;em&gt;exact same response&lt;/em&gt; at the same time.&lt;/li&gt;
&lt;li&gt;  ✅ CPU and memory usage remain flat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;Hogo tracks "flights" based on the request method and URL. If a flight is already in the air (processing), subsequent identical requests attach themselves as passengers to that flight instead of launching their own.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Hogo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hogo&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Hogo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// This handler will run ONLY ONCE if 100 requests hit it simultaneously&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/expensive-data&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ship&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;data&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;heavyAggregation&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ship&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ignite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benchmarks
&lt;/h3&gt;

&lt;p&gt;In our tests simulating 1000 concurrent requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Traditional Framework&lt;/strong&gt;: 1000 DB queries, High CPU spike.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Hogo&lt;/strong&gt;: 1 DB query, Low CPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not just caching (which has TTLs and invalidation logic). It's &lt;strong&gt;live deduplication&lt;/strong&gt;. If no one is asking, nothing is calculated. If 1000 people ask, it's calculated once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;Hogo is lightweight and has &lt;strong&gt;zero dependencies&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;hogo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give it a try and let me know what you think!&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;NPM&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/hogo" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/hogo&lt;/a&gt;&lt;br&gt;
🔗 &lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/hogo-js/hogo" rel="noopener noreferrer"&gt;https://github.com/hogo-js/hogo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>performance</category>
      <category>backend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Discover Realtime Location Tracker: An Open-Source PWA for Real-Time Device Monitoring and Communication</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Thu, 01 Jan 2026 20:08:00 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/discover-realtime-location-tracker-an-open-source-pwa-for-real-time-device-monitoring-and-4nll</link>
      <guid>https://forem.com/mahmud-r-farhan/discover-realtime-location-tracker-an-open-source-pwa-for-real-time-device-monitoring-and-4nll</guid>
      <description>&lt;p&gt;Hey devs! If you're into building apps that involve location services, real-time communication, or IoT-like tracking, I've got an exciting open-source project to share. It's called &lt;strong&gt;Realtime Location Tracker&lt;/strong&gt;, created by Mahmud Rahman (GitHub: &lt;a href="https://github.com/mahmud-r-farhan" rel="noopener noreferrer"&gt;mahmud-r-farhan&lt;/a&gt;). This Progressive Web App (PWA) lets you monitor and track connected devices in real-time, complete with interactive maps, instant messaging, and even voice calls. Whether you're working on fleet management, delivery apps, team coordination, or personal safety tools, this project packs a punch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Realtime Location Tracker?
&lt;/h2&gt;

&lt;p&gt;At its core, this is a PWA designed to track the real-time locations of multiple devices. It uses GPS data to plot positions on an interactive map and supports features like emergency SOS alerts, live chat, and audio communication. The app is responsive, works offline (with limitations), and can be installed on desktops or mobiles just like a native app.&lt;/p&gt;

&lt;p&gt;Key use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fleet management and delivery tracking&lt;/li&gt;
&lt;li&gt;Team coordination in the field&lt;/li&gt;
&lt;li&gt;Personal location sharing with friends/family&lt;/li&gt;
&lt;li&gt;Emergency response systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project emphasizes reliability as it scales, with updates pushing for actionable insights and user-friendly design. Mahmud describes it as a "game-changer" that turns simple monitoring into intelligent, confidence-boosting management.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;Here's a breakdown of the standout features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Tracking&lt;/strong&gt;: Continuous GPS updates visualized on a Leaflet map. Devices appear as markers with pop-up details like battery level, platform, and connection status.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Device Management&lt;/strong&gt;: Automatic device identification, custom icons, and a connection panel to oversee all active users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication Tools&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Live chat powered by WebSockets (Socket.IO) – send messages and even click them to zoom to the sender's location.&lt;/li&gt;
&lt;li&gt;Real-time audio calls via WebRTC, including a "megaphone" mode for broadcasting to all users.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Emergency SOS (Version 4.0+)&lt;/strong&gt;: Hold a button to send an alert with GPS coords, battery info, IP geolocation, and more. Receivers get audio alarms, vibrations (on mobile), and browser notifications.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;PWA Capabilities&lt;/strong&gt;: Installable, offline support with a fallback page, service worker caching, auto-updates, and push notifications.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Activity Logging&lt;/strong&gt;: Server-side logs for connections, disconnections, and events.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Geofencing and Intelligent Monitoring&lt;/strong&gt;: Recent updates add battery alerts to prevent disconnections and geofencing for location-based triggers.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Responsive UI&lt;/strong&gt;: Dark/light themes, intuitive controls like Floating Action Buttons (FAB), and compatibility across devices.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;These features make it more than just a tracker – it's a full-fledged communication hub.&lt;/p&gt;

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

&lt;p&gt;The project is built with a modern, lightweight stack that's easy to hack on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js (v18+), Express.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Comms&lt;/strong&gt;: Socket.IO for messaging and location events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mapping&lt;/strong&gt;: Leaflet with OpenStreetMap (supports offline maps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audio&lt;/strong&gt;: WebRTC for peer-to-peer voice&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: HTML, CSS, JavaScript, EJS templates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA Essentials&lt;/strong&gt;: Web App Manifest, Service Worker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Docker and Docker Compose for easy containerization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other Tools&lt;/strong&gt;: npm, Git, GitHub Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No heavy frameworks here – it's vanilla JS with targeted libraries, making it performant and straightforward to extend.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;p&gt;Setting up is a breeze. Here's the quick guide:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the Repo&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   git clone https://github.com/mahmud-r-farhan/Realtime-Location-Tracker.git
   cd Realtime-Location-Tracker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install Dependencies&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run the App&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;http://localhost:3007&lt;/code&gt; in your browser, grant location permissions, and start tracking!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For production, use Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t realtime-location-tracker .
docker run -p 3007:3007 realtime-location-tracker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or Docker Compose: &lt;code&gt;docker-compose up -d&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To test real-time features, open the app in multiple browsers or devices and invite others to join. Grant location access, and watch the magic happen on the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo and Visuals
&lt;/h2&gt;

&lt;p&gt;Check out the live demo here: &lt;a href="https://realtime-location-tracker-v9ow.onrender.com/" rel="noopener noreferrer"&gt;https://realtime-location-tracker-v9ow.onrender.com/&lt;/a&gt;. It's best experienced with multiple users – share the link and see real-time updates in action.&lt;/p&gt;

&lt;p&gt;Mahmud also shared a demo video on LinkedIn: &lt;a href="https://lnkd.in/gu2K4PPx" rel="noopener noreferrer"&gt;Watch the Demo&lt;/a&gt;. It showcases the updated UI, audio rooms, and tracking in motion.&lt;/p&gt;

&lt;p&gt;Screenshots are available in the repo's &lt;code&gt;public/assets/&lt;/code&gt; folder, covering Android/iOS logs and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Contribute or Use This Project?
&lt;/h2&gt;

&lt;p&gt;As an open-source project, it's licensed under terms that encourage collaboration (check &lt;code&gt;LICENSE&lt;/code&gt; in the repo). If you're interested in contributing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Follow &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; for guidelines.&lt;/li&gt;
&lt;li&gt;Adhere to the &lt;code&gt;CODE_OF_CONDUCT.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Report security issues via &lt;code&gt;SECURITY.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Submit pull requests with tests and alignment to the core stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a great starting point for learning about WebSockets, WebRTC, PWAs, or location-based apps. Plus, with features like geofencing and IoT integration, it has real-world potential for customization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Realtime Location Tracker is a solid example of how open-source can drive innovation in tracking and communication tech. Kudos to Mahmud Rahman for building and sharing this – it's pushing boundaries in real-time apps.&lt;/p&gt;

&lt;p&gt;If this sparks your interest, star the repo on GitHub: &lt;a href="https://github.com/mahmud-r-farhan/Realtime-Location-Tracker" rel="noopener noreferrer"&gt;https://github.com/mahmud-r-farhan/Realtime-Location-Tracker&lt;/a&gt;, fork it, and build something awesome. Drop your thoughts in the comments – have you built similar apps? What's your take on WebRTC for audio in PWAs?&lt;/p&gt;

</description>
      <category>node</category>
      <category>socket</category>
      <category>pwa</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🐻 Introducing Zustand Copilot: The Ultimate VS Code Extension for Zustand State Management</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Fri, 26 Dec 2025 19:11:18 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/introducing-zustand-copilot-the-ultimate-vs-code-extension-for-zustand-state-management-1ede</link>
      <guid>https://forem.com/mahmud-r-farhan/introducing-zustand-copilot-the-ultimate-vs-code-extension-for-zustand-state-management-1ede</guid>
      <description>&lt;p&gt;If you've been working with &lt;strong&gt;Zustand&lt;/strong&gt; for state management in React, you know how elegant and powerful it is. But what if you could make your Zustand development experience even better?&lt;/p&gt;

&lt;p&gt;Today, I'm excited to announce &lt;strong&gt;Zustand Copilot&lt;/strong&gt; — a VS Code extension designed to be the definitive toolkit for Zustand v5+ development.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Why I Built This
&lt;/h2&gt;

&lt;p&gt;After building dozens of React applications with Zustand, I found myself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📝 Typing the same store boilerplate over and over&lt;/li&gt;
&lt;li&gt;🔍 Constantly switching to docs for syntax reference&lt;/li&gt;
&lt;li&gt;😓 Forgetting to use &lt;code&gt;useShallow&lt;/code&gt; for multi-value selectors (hello, unnecessary re-renders!)&lt;/li&gt;
&lt;li&gt;📁 Manually setting up the Slices Pattern for larger apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Zustand Copilot solves all of these problems.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. TypeScript-First Snippets
&lt;/h3&gt;

&lt;p&gt;Just type a prefix and get production-ready code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prefix&lt;/th&gt;
&lt;th&gt;What You Get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zstore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Complete store with devtools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zslice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Slice for the Slices Pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zpersist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persisted store with localStorage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zshallow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;useShallow selector (performance!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zasync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Async store with loading states&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zimmer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Immer-powered mutable updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example: Type &lt;code&gt;zstore&lt;/code&gt; and get:&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zustand&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;devtools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zustand/middleware&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CounterState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useCounterStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CounterState&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt;
  &lt;span class="nf"&gt;devtools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;count&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="na"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;:&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;set&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;:&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;set&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;decrement&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;:&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;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;count&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="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reset&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CounterStore&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="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Smart Code Actions
&lt;/h3&gt;

&lt;p&gt;Right-click on any store and get intelligent refactoring options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrap with devtools&lt;/strong&gt; — Add Redux DevTools integration instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrap with persist&lt;/strong&gt; — Add localStorage persistence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add useShallow&lt;/strong&gt; — Optimize your selectors for performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract to Slices Pattern&lt;/strong&gt; — Modularize large stores&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Real-Time Hover Documentation
&lt;/h3&gt;

&lt;p&gt;Hover over any Zustand function and get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📖 Detailed description&lt;/li&gt;
&lt;li&gt;📝 TypeScript signature&lt;/li&gt;
&lt;li&gt;💻 Usage examples&lt;/li&gt;
&lt;li&gt;⚡ Performance tips&lt;/li&gt;
&lt;li&gt;🔗 Links to official docs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Intelligent Auto-Imports
&lt;/h3&gt;

&lt;p&gt;Start typing and get smart import suggestions for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;createStore&lt;/code&gt;, &lt;code&gt;useStore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;devtools&lt;/code&gt;, &lt;code&gt;persist&lt;/code&gt;, &lt;code&gt;immer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useShallow&lt;/code&gt; (with performance hints!)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;StateCreator&lt;/code&gt;, &lt;code&gt;StoreApi&lt;/code&gt; types&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Command-Driven Store Generation
&lt;/h3&gt;

&lt;p&gt;Use the Command Palette (&lt;code&gt;Ctrl+Shift+P&lt;/code&gt;) to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Create New Store&lt;/strong&gt; — Interactive store generator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create New Slice&lt;/strong&gt; — Generate slice files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Slices Pattern Store&lt;/strong&gt; — Full project structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Performance Best Practices Built-In
&lt;/h2&gt;

&lt;p&gt;Zustand Copilot doesn't just help you write code faster — it helps you write &lt;strong&gt;better&lt;/strong&gt; code.&lt;/p&gt;

&lt;h3&gt;
  
  
  useShallow Everywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Bad: Creates new object on every render&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useStore&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; 
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; 
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Good: Shallow comparison prevents re-renders&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;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useStore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;useShallow&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; 
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&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;The extension will &lt;strong&gt;warn you&lt;/strong&gt; when you forget &lt;code&gt;useShallow&lt;/code&gt; and offer to add it automatically!&lt;/p&gt;

&lt;h3&gt;
  
  
  Slices Pattern for Scale
&lt;/h3&gt;

&lt;p&gt;For large applications, the extension encourages the &lt;strong&gt;Slices Pattern&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/stores/
├── index.ts           # Combined store
└── slices/
    ├── authSlice.ts   # Authentication
    ├── userSlice.ts   # User data
    └── settingsSlice.ts # Settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the &lt;code&gt;Zustand: Generate Slices Pattern Store&lt;/code&gt; command to scaffold this instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open VS Code&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl+Shift+X&lt;/code&gt; to open Extensions&lt;/li&gt;
&lt;li&gt;Search for "Zustand Copilot"&lt;/li&gt;
&lt;li&gt;Click Install&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or install via CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; devplusfun.zustand-copilot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Create a new &lt;code&gt;.ts&lt;/code&gt; or &lt;code&gt;.tsx&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;zstore&lt;/code&gt; and press &lt;code&gt;Tab&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fill in the placeholders&lt;/li&gt;
&lt;li&gt;Start building! 🐻&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📊 Available Snippets
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Snippet&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zstore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Basic store with devtools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zslice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Slice for Slices Pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zpersist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Persisted store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zasync&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Async store with loading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zimmer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Immer middleware store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zslices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Combined slices store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zshallow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;useShallow selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zselector&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memoized selector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zsubscribe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zgetstate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Access state outside React&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zcontext&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Context pattern store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zcomputed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Computed properties&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zreset&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store with reset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zmiddleware&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full middleware stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zactions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Separate actions interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ztemporal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Undo/redo with zundo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🛠 Configuration
&lt;/h2&gt;

&lt;p&gt;Customize the extension in your VS Code settings:&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;"zustandCopilot.autoImport.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zustandCopilot.hoverDocs.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zustandCopilot.codeActions.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zustandCopilot.defaultStorePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/stores"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zustandCopilot.useShallowByDefault"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"zustandCopilot.includeDevtools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;h2&gt;
  
  
  🙏 Feedback Welcome!
&lt;/h2&gt;

&lt;p&gt;This is just version 1.0.0, and I have big plans for future releases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 Store visualization panel&lt;/li&gt;
&lt;li&gt;🧪 Testing utilities&lt;/li&gt;
&lt;li&gt;🔄 Redux → Zustand migration tools&lt;/li&gt;
&lt;li&gt;📈 Performance analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What features would you like to see?&lt;/strong&gt; Drop a comment below or open an issue on GitHub!&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://marketplace.visualstudio.com/items?itemName=MahmudRahman.zustand-copilot" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://docs.pmnd.rs/zustand" rel="noopener noreferrer"&gt;Zustand Official Docs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If this extension helps your Zustand development, please ⭐ star the repo and leave a review on the marketplace! It really helps others discover it.&lt;/p&gt;

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




</description>
      <category>react</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Building an AI-Powered Resume Analyzer: My Journey with Resume Analiser</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Mon, 22 Dec 2025 09:18:46 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/building-an-ai-powered-resume-analyzer-my-journey-with-resume-analiser-3lbf</link>
      <guid>https://forem.com/mahmud-r-farhan/building-an-ai-powered-resume-analyzer-my-journey-with-resume-analiser-3lbf</guid>
      <description>&lt;p&gt;Hey dev.to community! 👋 I'm Mahmud Rahman Farhan, a full-stack JavaScript developer from Bangladesh. Over the past few months, I've been working on a project that's close to my heart (and super useful in today's job market): an &lt;strong&gt;AI-powered resume optimizer&lt;/strong&gt; called &lt;strong&gt;Resume Analiser&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a world where ATS (Applicant Tracking Systems) reject 75% of resumes before a human even sees them, tailoring your resume to each job description is crucial. That's why I built this tool – to help job seekers like you (and me!) personalize resumes quickly and effectively using AI.&lt;/p&gt;

&lt;p&gt;Check out the GitHub repo here: &lt;a href="https://github.com/mahmud-r-farhan/resume-analiser" rel="noopener noreferrer"&gt;https://github.com/mahmud-r-farhan/resume-analiser&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And there's even a live demo: &lt;a href="https://resumeanalizer.vercel.app/" rel="noopener noreferrer"&gt;https://resumeanalizer.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Does It Do?
&lt;/h3&gt;

&lt;p&gt;Resume Analiser is your personal career copilot. Here's the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload your PDF resume&lt;/strong&gt; (text-based only for now – scanned PDFs coming soon via OCR!).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste the target job description&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hit analyze&lt;/strong&gt; – powered by AI models from OpenRouter.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;premium analysis dashboard&lt;/strong&gt; with:

&lt;ul&gt;
&lt;li&gt;Executive summary&lt;/li&gt;
&lt;li&gt;Strengths in your resume&lt;/li&gt;
&lt;li&gt;Keyword gaps (super important for ATS!)&lt;/li&gt;
&lt;li&gt;ATS-friendly guidance&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;A &lt;strong&gt;dynamic fit score&lt;/strong&gt; visualized as a cool gauge showing how well your resume matches the job.&lt;/li&gt;

&lt;li&gt;An &lt;strong&gt;optimized, regenerated resume&lt;/strong&gt; in Markdown format, tailored to the job.&lt;/li&gt;

&lt;li&gt;Support for different templates: Classic, Modern, or Functional – regenerate with one click!&lt;/li&gt;

&lt;li&gt;Easy exports: Copy Markdown, download as PDF, or save the full analysis.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;It's all about making your resume stand out while beating those pesky ATS filters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;p&gt;I went with a modern, full-stack JavaScript setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React + Vite for fast development, Tailwind CSS for styling, Framer Motion for smooth animations, and Sonner for toast notifications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js + Express.js for the API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: MongoDB (optional, mainly for logging analyses).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Integration&lt;/strong&gt;: OpenRouter.ai – flexible access to various LLMs (you can pick free or paid models).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Frontend on Vercel (hence the live demo).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is open-source under the MIT license, so feel free to fork and tweak!&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I Built This
&lt;/h3&gt;

&lt;p&gt;Job hunting can be brutal. I've applied to countless roles and seen great candidates get ghosted because their resume didn't have the "right" keywords. Tools like this exist (some paid ones are pricey), but I wanted something accessible, customizable, and built with open AI providers.&lt;/p&gt;

&lt;p&gt;Plus, it was a great excuse to dive deeper into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF parsing on the backend.&lt;/li&gt;
&lt;li&gt;Prompt engineering for accurate resume analysis and regeneration.&lt;/li&gt;
&lt;li&gt;Building a resilient UI that handles API rate limits gracefully.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Features in Action
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rich Markdown Rendering&lt;/strong&gt;: The analysis and new resume look beautiful with highlighted sections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template Switching&lt;/strong&gt;: Not happy with the layout? Switch and regenerate instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilient Experience&lt;/strong&gt;: Loading spinners, error handling for rate limits, and helpful tips throughout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limitations? Free AI models might throttle on heavy use, and image-based PDFs aren't supported yet (roadmap item!).&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Run It Locally
&lt;/h3&gt;

&lt;p&gt;Want to try it yourself or contribute?&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/mahmud-r-farhan/resume-analiser.git
&lt;span class="nb"&gt;cd &lt;/span&gt;resume-analiser

&lt;span class="c"&gt;# Backend&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="c"&gt;# Add your .env (see README for keys, especially OPENROUTER_API_KEY)&lt;/span&gt;

npm run dev

&lt;span class="c"&gt;# Frontend (in another terminal)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="c"&gt;# Add .env for API endpoint&lt;/span&gt;

npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5173" rel="noopener noreferrer"&gt;http://localhost:5173&lt;/a&gt; and start optimizing!&lt;/p&gt;

&lt;p&gt;Video tutorial[2]: &lt;a href="https://youtu.be/6tqwrwDfaJY?si=dpa8KtZaRrZiucV7" rel="noopener noreferrer"&gt;https://youtu.be/6tqwrwDfaJY?si=dpa8KtZaRrZiucV7&lt;/a&gt;&lt;br&gt;
Video tutorial[1]: &lt;a href="https://youtu.be/bwddg9qh_vE?si=nqAqZJN-xHfQq6cE" rel="noopener noreferrer"&gt;https://youtu.be/bwddg9qh_vE?si=nqAqZJN-xHfQq6cE&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add OCR for scanned PDFs.&lt;/li&gt;
&lt;li&gt;More templates and customization options.&lt;/li&gt;
&lt;li&gt;User accounts for saving histories (using MongoDB more fully).&lt;/li&gt;
&lt;li&gt;Maybe integrate more AI providers or fine-tuned prompts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you like the project, give it a star on GitHub ⭐ – it motivates me a ton (it's at 3 stars right now 😅).&lt;/p&gt;

&lt;p&gt;I'd love feedback! Have you used similar tools? What features would you add? Drop a comment below.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and happy job hunting! 🚀&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>resume</category>
      <category>career</category>
    </item>
    <item>
      <title>Regular Expressions Fast – JavaScript Regex (Beginner to Pro)</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Thu, 18 Dec 2025 04:29:35 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/regular-expressions-fast-javascript-regex-beginner-to-pro-4egb</link>
      <guid>https://forem.com/mahmud-r-farhan/regular-expressions-fast-javascript-regex-beginner-to-pro-4egb</guid>
      <description>&lt;p&gt;If the words &lt;em&gt;regular expression&lt;/em&gt; make you nervous, good. That means you haven’t wasted years avoiding one of the most powerful tools in programming.&lt;/p&gt;

&lt;p&gt;Regex is not magic. It’s just a compact language for &lt;strong&gt;finding, validating, extracting, and replacing text&lt;/strong&gt;. Once you understand the rules, it becomes predictable and fast.&lt;/p&gt;

&lt;p&gt;This article is &lt;strong&gt;beginner‑friendly&lt;/strong&gt;, but it &lt;strong&gt;does not dumb things down&lt;/strong&gt;. We’ll cover regex properly, with clean JavaScript examples and practical use cases.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Regular Expression?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;regular expression (regex)&lt;/strong&gt; is a pattern used to match text.&lt;/p&gt;

&lt;p&gt;In JavaScript, regex is mainly used with strings:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;"&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="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/world/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ['world']&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You define regex patterns using:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;flags&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hello&lt;/code&gt; → pattern&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;i&lt;/code&gt; → flag (case‑insensitive)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Regex Works (Mental Model)
&lt;/h2&gt;

&lt;p&gt;Regex works &lt;strong&gt;left to right&lt;/strong&gt;, character by character.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The engine reads the string&lt;/li&gt;
&lt;li&gt;Tries to match your pattern&lt;/li&gt;
&lt;li&gt;Stops when it fails or succeeds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No mystery. Just rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating Regex in JavaScript
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Literal syntax (most common)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/abc/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Constructor syntax (dynamic patterns)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc&lt;/span&gt;&lt;span class="dl"&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;regex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the constructor &lt;strong&gt;only&lt;/strong&gt; when patterns must be dynamic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Regex Methods in JavaScript
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;test()&lt;/code&gt; → true / false
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;abc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;match()&lt;/code&gt; → get matched result
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/abc/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;replace()&lt;/code&gt; → replace text
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/world/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JS&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;h3&gt;
  
  
  &lt;code&gt;search()&lt;/code&gt; → index of match
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/e/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Characters and Literals
&lt;/h2&gt;

&lt;p&gt;Basic matching:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;   &lt;span class="c1"&gt;// matches "hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regex is &lt;strong&gt;case‑sensitive by default&lt;/strong&gt;.&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;  &lt;span class="c1"&gt;// matches "Hello", "HELLO"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Special Characters (Meta Characters)
&lt;/h2&gt;

&lt;p&gt;These characters have special meaning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;. ^ $ * + ? ( ) [ ] { } | \
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To match them literally, &lt;strong&gt;escape with &lt;code&gt;\\&lt;/code&gt;&lt;/strong&gt;:&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="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;  &lt;span class="c1"&gt;// matches a dot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Character Classes &lt;code&gt;[ ]&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Match &lt;strong&gt;one character from a set&lt;/strong&gt;:&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="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;     &lt;span class="c1"&gt;// a OR b OR c&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;0-9&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;     &lt;span class="c1"&gt;// any digit&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;     &lt;span class="c1"&gt;// lowercase letters&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;     &lt;span class="c1"&gt;// uppercase letters&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Negation:&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="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;    &lt;span class="c1"&gt;// NOT a digit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Shorthand Character Classes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pattern&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;digit (0–9)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\D&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;not digit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;word char (a–z, A–Z, 0–9, _)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\W&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;not word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;whitespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\S&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;not whitespace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&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="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/.test&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;"123"&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;; /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quantifiers (How Many?)
&lt;/h2&gt;

&lt;p&gt;Quantifiers control repetition.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0 or more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 or more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0 or 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{n}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;exactly n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{n,}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;n or more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{n,m}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;between n and m&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Examples:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="sr"&gt;/    /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aaaa&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/    /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aaaa&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/  /&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aa&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Greedy vs Lazy Matching
&lt;/h2&gt;

&lt;p&gt;Regex is &lt;strong&gt;greedy by default&lt;/strong&gt;.&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;div&amp;gt;test&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;.*&amp;gt;/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// matches everything&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lazy version:&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;div&amp;gt;test&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&amp;lt;.*&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;?&lt;/code&gt; to make it lazy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Anchors &lt;code&gt;^&lt;/code&gt; and &lt;code&gt;$&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Anchors match &lt;strong&gt;positions&lt;/strong&gt;, not characters.&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="o"&gt;/^&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;   &lt;span class="c1"&gt;// starts with hello&lt;/span&gt;
&lt;span class="sr"&gt;/world$/&lt;/span&gt;  &lt;span class="c1"&gt;// ends with world&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful for validation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Groups &lt;code&gt;( )&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Groups let you capture parts of a match.&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="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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-12-18&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{4})&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;(\d{2})&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;(\d{2})&lt;/span&gt;&lt;span class="sr"&gt;/&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// year&lt;/span&gt;
&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// month&lt;/span&gt;
&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// day&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Non‑capturing group:&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="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(?:&lt;/span&gt;&lt;span class="nx"&gt;abc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Alternation &lt;code&gt;|&lt;/code&gt; (OR)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;cat&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;dog&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Matches either &lt;code&gt;cat&lt;/code&gt; or &lt;code&gt;dog&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Flags
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;global&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;i&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;case‑insensitive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;m&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;multiline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;dot matches newline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;unicode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;sticky&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&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="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;gi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Lookaheads &amp;amp; Lookbehinds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Positive Lookahead
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;  &lt;span class="c1"&gt;// digit followed by px&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Negative Lookahead
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nf"&gt;d&lt;/span&gt;&lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lookbehind (modern JS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use sparingly. They reduce readability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Real‑World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Email Validation (simple)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/^&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;@]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;@[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;@]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;@]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phone Number
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Password (basic rules)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;/^&lt;/span&gt;&lt;span class="p"&gt;(?&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;])(?&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&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="nx"&gt;$&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Performance Tips (Important)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Avoid &lt;code&gt;.*&lt;/code&gt; when possible&lt;/li&gt;
&lt;li&gt;Anchor your regex (&lt;code&gt;^&lt;/code&gt;, &lt;code&gt;$&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Keep patterns specific&lt;/li&gt;
&lt;li&gt;Don’t overuse lookarounds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bad regex &lt;strong&gt;will be slow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Debugging Regex
&lt;/h2&gt;

&lt;p&gt;Use tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regex101&lt;/li&gt;
&lt;li&gt;Regexr&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test small. Build step by step.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Advice (Brutally Honest)
&lt;/h2&gt;

&lt;p&gt;Regex is not hard.&lt;/p&gt;

&lt;p&gt;Unreadable regex is your fault, not regex’s.&lt;/p&gt;

&lt;p&gt;If your pattern looks like line noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Break it&lt;/li&gt;
&lt;li&gt;Comment it&lt;/li&gt;
&lt;li&gt;Or don’t use regex at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use regex &lt;strong&gt;when it simplifies the problem&lt;/strong&gt;, not to show off.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cheat Sheet
&lt;/h2&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="nx"&gt;any&lt;/span&gt; &lt;span class="nx"&gt;char&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;     &lt;span class="nx"&gt;digit&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;     &lt;span class="nx"&gt;word&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;     &lt;span class="nx"&gt;space&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;      &lt;span class="nx"&gt;one&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;more&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;      &lt;span class="nx"&gt;zero&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;more&lt;/span&gt;
&lt;span class="p"&gt;?&lt;/span&gt;      &lt;span class="nx"&gt;optional&lt;/span&gt;
&lt;span class="o"&gt;^&lt;/span&gt;      &lt;span class="nx"&gt;start&lt;/span&gt;
&lt;span class="nx"&gt;$&lt;/span&gt;      &lt;span class="nx"&gt;end&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="nx"&gt;OR&lt;/span&gt;
&lt;span class="p"&gt;()&lt;/span&gt;     &lt;span class="nx"&gt;group&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;If you master regex, text stops being messy.&lt;br&gt;
It becomes structured.&lt;/p&gt;

&lt;p&gt;And that skill pays forever.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Follow for more! &lt;a class="mentioned-user" href="https://dev.to/mahmud-r-farhan"&gt;@mahmud-r-farhan&lt;/a&gt; &lt;br&gt;
Contact: &lt;a href="https://gravatar.com/floawd" rel="noopener noreferrer"&gt;https://gravatar.com/floawd&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>regex</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Connect MongoDB &amp; PostgreSQL in Node.js</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Thu, 13 Nov 2025 15:20:11 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/connect-mongodb-postgresql-in-nodejs-1oe2</link>
      <guid>https://forem.com/mahmud-r-farhan/connect-mongodb-postgresql-in-nodejs-1oe2</guid>
      <description>&lt;p&gt;Connecting your database might sound simple, “paste the URI and go,” right?&lt;br&gt;
However, as your app grows, a sloppy connection setup can lead to timeouts, hanging requests, or silent disconnections.&lt;br&gt;
Let’s fix that from the start. &lt;/p&gt;
&lt;h2&gt;
  
  
  What You’ll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How to connect Node.js with &lt;strong&gt;MongoDB&lt;/strong&gt; (via Mongoose)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to connect Node.js with &lt;strong&gt;PostgreSQL&lt;/strong&gt; (via &lt;code&gt;pg&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proper async setup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handle &lt;strong&gt;errors&lt;/strong&gt;, &lt;strong&gt;timeouts&lt;/strong&gt;, and &lt;strong&gt;disconnects&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write connection code you can actually reuse in production&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  MongoDB Connection (with Mongoose)
&lt;/h2&gt;

&lt;p&gt;Mongoose is the go-to library for Node.js + MongoDB. It simplifies schema management and handles async connections.&lt;/p&gt;
&lt;h3&gt;
  
  
  1 Install dependencies
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;mongoose

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2 Create a connection file
&lt;/h3&gt;

&lt;p&gt;Let’s call it &lt;code&gt;db/mongo.js&lt;/code&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&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;MONGO_URI&lt;/span&gt; &lt;span class="o"&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;MONGO_URI&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongodb://localhost:27017/myapp&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;connectMongo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Set connection options&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;useNewUrlParser&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="na"&gt;useUnifiedTopology&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="na"&gt;serverSelectionTimeoutMS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Timeout after 5s&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MONGO_URI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;✅ MongoDB connected successfully&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="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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;❌ MongoDB connection error:&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="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Handle runtime errors&lt;/span&gt;
  &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&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;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;⚠️ MongoDB connection error:&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="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;disconnected&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="o"&gt;=&amp;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="s2"&gt;🔌 MongoDB disconnected&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="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3 Use it in your app
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connectMongo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./db/mongo.js&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;connectMongo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🚀 Server running on port 3000&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;h2&gt;
  
  
  PostgreSQL Connection (with &lt;code&gt;pg&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;PostgreSQL uses the official &lt;a href="https://www.npmjs.com/package/pg" rel="noopener noreferrer"&gt;&lt;code&gt;pg&lt;/code&gt;&lt;/a&gt; package. Simple and solid.&lt;/p&gt;

&lt;h3&gt;
  
  
  1 Install dependencies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;pg

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2 Create a connection file
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;db/postgres.js&lt;/code&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pkg&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&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;Pool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pkg&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;POSTGRES_URI&lt;/span&gt; &lt;span class="o"&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;POSTGRES_URI&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;postgresql://user:password@localhost:5432/myapp&lt;/span&gt;&lt;span class="dl"&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;pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;POSTGRES_URI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;idleTimeoutMillis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Close idle clients after 5s&lt;/span&gt;
  &lt;span class="na"&gt;connectionTimeoutMillis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Timeout after 5s if cannot connect&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;connect&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="o"&gt;=&amp;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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;✅ PostgreSQL connected successfully&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&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;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;❌ Unexpected PostgreSQL error:&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;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;query&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;params&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;client&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;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;try&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;res&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&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;params&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;⚠️ Query error:&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="k"&gt;throw&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="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&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;
  
  
  3 Use it in your app
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&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="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./db/postgres.js&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;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;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT NOW()&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&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;rows&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;🚀 Server running on port 3000&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;h2&gt;
  
  
  Quick Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Always &lt;strong&gt;wrap connections in async functions&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use &lt;strong&gt;env variables&lt;/strong&gt; for credentials never hardcode them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;strong&gt;timeouts&lt;/strong&gt; so your app doesn’t hang forever&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use event listeners (&lt;code&gt;on('error')&lt;/code&gt;, &lt;code&gt;on('disconnected')&lt;/code&gt;) to handle runtime issues&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For real projects, add a &lt;strong&gt;reconnection logic&lt;/strong&gt; if needed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Example &lt;code&gt;.env&lt;/code&gt; file
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MONGO_URI=mongodb://localhost:27017/myapp
POSTGRES_URI=postgresql://user:password@localhost:5432/myapp

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Wrap-Up
&lt;/h2&gt;

&lt;p&gt;Connecting to a database isn’t just about making it work. It’s about ensuring stability, so your app remains operational even when the database restarts or the network experiences hiccups.&lt;/p&gt;

</description>
      <category>node</category>
      <category>mongodb</category>
      <category>postgressql</category>
      <category>database</category>
    </item>
    <item>
      <title>🚀 Unleash Your Browser's Hidden Superpowers: 3 Chrome DevTools Tricks to 10x Your Productivity</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Thu, 06 Nov 2025 13:53:04 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/unleash-your-browsers-hidden-superpowers-3-chrome-devtools-tricks-to-10x-your-productivity-42h2</link>
      <guid>https://forem.com/mahmud-r-farhan/unleash-your-browsers-hidden-superpowers-3-chrome-devtools-tricks-to-10x-your-productivity-42h2</guid>
      <description>&lt;p&gt;As developers, we practically live in the browser's console. It's our primary debugging battleground. But let's be honest: many of us stick to the basics, &lt;strong&gt;Inspect Element&lt;/strong&gt; and the &lt;strong&gt;Console log&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your familiar browser is hiding a suite of advanced tools that can transform your daily development life, making it faster, more insightful, and genuinely enjoyable.&lt;/p&gt;

&lt;p&gt;Stop the tedious cycle of code-to-save-to reload." It's time to leverage Chrome DevTools' secret weapons!&lt;/p&gt;




&lt;h3&gt;
  
  
  1. 🎨 Design Mode: Your Browser is Now a Live Canvas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; You want to test a quick content change a different heading, a punchier call-to-action, or a slightly shorter paragraph. The typical workflow? Go to VS Code, edit the text, save the file, and refresh the browser. It's slow and disruptive to your flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Superpower:&lt;/strong&gt; Instantly edit any text on any webpage directly in the browser, just like you would in MS Word or Notepad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Use It (The Trick):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Open your &lt;strong&gt;Console&lt;/strong&gt; (Ctrl+Shift+J or Cmd+Option+J).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Paste and run this single line of JavaScript:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;designMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;on&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;That's it!&lt;/strong&gt; Click on any text on the page and start typing.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💡 Real-World Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rapid A/B Testing:&lt;/strong&gt; Quickly mock up two different headline versions to visually compare which has a better impact &lt;em&gt;before&lt;/em&gt; you commit to a single line of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Demos:&lt;/strong&gt; Need to show a client exactly how a specific piece of text will look without deploying or making a commit? Edit it live in the meeting for instant feedback.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. 🐢 Network Throttling: Stop Developing for Perfect Wi-Fi
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Your lightning-fast fiber optic connection at home or the office masks serious performance issues for users with slower internet. Your site might load in 1 second for you, but what is the experience for a user on a slow mobile connection?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Superpower:&lt;/strong&gt; Artificially simulate slow network conditions (like Slow 3G) directly in DevTools to experience your site like a remote user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Use It (The Trick):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Open DevTools and navigate to the &lt;strong&gt;Network&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt; Look for the &lt;strong&gt;"No throttling"&lt;/strong&gt; dropdown (usually near the top).&lt;/li&gt;
&lt;li&gt; Click it and select an option like &lt;strong&gt;"Slow 3G"&lt;/strong&gt; or &lt;strong&gt;"Fast 3G."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt; Reload your page. Watch the waterfall chart fill up and see exactly which assets are bogging down the load time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💡 Real-World Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identifying Critical Assets:&lt;/strong&gt; You'll quickly see if a massive image or a non-critical third-party script is delaying the &lt;strong&gt;First Contentful Paint (FCP)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Budgeting:&lt;/strong&gt; Ensure your core user experience holds up even under adverse conditions, a crucial step in building truly resilient web applications.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. 📸 Full Page Snapshot: Say Goodbye to Screenshot Extensions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; You need a high-resolution screenshot of an &lt;em&gt;entire&lt;/em&gt; webpage, from the header to the footer, even the parts that require scrolling. This usually means installing a third-party browser extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Superpower:&lt;/strong&gt; Capture a full-page, high-fidelity image of the entire viewport—no scrolling, no extensions, no hassle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Use It (The Trick):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Open DevTools.&lt;/li&gt;
&lt;li&gt; Open the &lt;strong&gt;Command Menu&lt;/strong&gt; by pressing &lt;strong&gt;Ctrl + Shift + P&lt;/strong&gt; (Windows/Linux) or &lt;strong&gt;Cmd + Shift + P&lt;/strong&gt; (Mac).&lt;/li&gt;
&lt;li&gt; Start typing: &lt;code&gt;Screenshot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; You will see several options:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capture full size screenshot:&lt;/strong&gt; Captures the &lt;em&gt;entire&lt;/em&gt; page (the one you want!).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capture node screenshot:&lt;/strong&gt; Captures only a specific element you have selected in the Elements panel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💡 Real-World Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bug Reporting:&lt;/strong&gt; Get a single, clean image of a layout issue on a long page for a colleague or QA team, providing all the context they need instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio/Documentation:&lt;/strong&gt; Easily create professional assets for your project documentation or personal portfolio with full-page fidelity.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🚀 &lt;strong&gt;BONUS: The Most Powerful Trick (Source Map Magic)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; You're debugging a minified, transpiled, or bundled JavaScript file in production. The code you see in DevTools is unreadable (&lt;code&gt;a.b.c(d)&lt;/code&gt;) and completely unlike the beautiful, organised code you wrote. Setting breakpoints becomes a nightmare.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Superpower:&lt;/strong&gt; Transform that ugly production code back into your original, readable source code right within the browser, allowing you to debug with ease, even in a live environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Use It (The Trick):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ensure your build process generates &lt;strong&gt;Source Maps&lt;/strong&gt; (most modern build tools like Webpack, Rollup, Vite, and Create React App do this by default in development, and often include options for production).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open DevTools and go to the &lt;strong&gt;Sources&lt;/strong&gt; tab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to your bundled JavaScript file (e.g.,  &lt;code&gt;main.js&lt;/code&gt;,  &lt;code&gt;bundle.js&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If DevTools detects a source map, it will often automatically load your original files under a &lt;code&gt;webpack://&lt;/code&gt; or &lt;code&gt;(no domain)&lt;/code&gt; folder structure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If not, right-click inside the minified file editor and select &lt;strong&gt;"Add source map..."&lt;/strong&gt; then point it to your &lt;code&gt;.map&lt;/code&gt; file if it's served separately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Voila!&lt;/strong&gt; You can now set breakpoints, inspect variables, and step through your &lt;em&gt;original, unminified&lt;/em&gt; code, even when running the production bundle.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;💡 Real-World Use Case:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production Debugging:&lt;/strong&gt; When a bug only appears in a production environment (due to server configuration, CDN issues, etc.), Source Maps are your absolute best friend. You can connect DevTools to a remote device or use &lt;code&gt;console.log&lt;/code&gt; with original line numbers for precise issue identification.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Understanding Third-Party Libraries:&lt;/strong&gt; Explore the unminified source of libraries you're using without cloning their repositories.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Final Thought
&lt;/h3&gt;

&lt;p&gt;Being a "smart developer" isn't just about writing clean code; it's about mastering your tools. These DevTools superpowers were right there, waiting for you. Integrating these few tricks into your daily workflow will make your job faster, more insightful, and definitely more interesting.&lt;/p&gt;

</description>
      <category>browser</category>
      <category>devtool</category>
      <category>productivity</category>
      <category>tricks</category>
    </item>
    <item>
      <title>🚀 Smart Reply | Now Available on the Web 🌐</title>
      <dc:creator>Mahmud Rahman</dc:creator>
      <pubDate>Sat, 01 Nov 2025 14:10:00 +0000</pubDate>
      <link>https://forem.com/mahmud-r-farhan/smart-reply-now-available-on-the-web-20jk</link>
      <guid>https://forem.com/mahmud-r-farhan/smart-reply-now-available-on-the-web-20jk</guid>
      <description>&lt;p&gt;Tired of typing the same replies repeatedly? Now, you don’t even need an extension. Meet Smart Reply Web, an AI-powered tool that instantly suggests the perfect reply for any message you paste.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 What it does
&lt;/h2&gt;

&lt;p&gt;✅ Paste any message — email, chat, or social DM&lt;/p&gt;

&lt;p&gt;⚡ Instantly get a natural, AI-generated reply suggestion&lt;/p&gt;

&lt;p&gt;🎯 Adjust tone — professional, casual, short &amp;amp; sweet&lt;/p&gt;

&lt;p&gt;🔒 100% private — your own API key, your data, your control&lt;/p&gt;

&lt;p&gt;🌍 Works right in your browser — no install, no hassle&lt;/p&gt;




&lt;h2&gt;
  
  
  👥 Who it’s for
&lt;/h2&gt;

&lt;p&gt;• Freelancers replying to endless client messages&lt;/p&gt;

&lt;p&gt;• Support teams tired of repetitive tickets&lt;/p&gt;

&lt;p&gt;• Busy professionals who want to respond faster without sounding robotic&lt;/p&gt;

&lt;p&gt;• No setup. No clutter. Just paste → get reply → copy → done.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Reply smarter. Save time. Focus on what matters.
&lt;/h3&gt;




&lt;h2&gt;
  
  
  👉 Try the web version now: &lt;a href="https://smart-reply-delta.vercel.app/" rel="noopener noreferrer"&gt;https://smart-reply-delta.vercel.app/&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  👉 Github: &lt;a href="https://github.com/mahmud-r-farhan/smart-reply" rel="noopener noreferrer"&gt;https://github.com/mahmud-r-farhan/smart-reply&lt;/a&gt;
&lt;/h2&gt;




&lt;h2&gt;
  
  
  ⚙️ Under the hood
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;React + Tailwind + Framer Motion = frontend&lt;/p&gt;

&lt;p&gt;Node.js + Express = backend&lt;/p&gt;

&lt;p&gt;Powered by OpenRouter AI models (supports free tiers)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Would you use Smart Reply in your daily workflow?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Let me know 👇&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>llm</category>
      <category>webdev</category>
      <category>tooling</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
