<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ishika Thakur</title>
    <description>The latest articles on DEV Community by Ishika Thakur (@ishikathakur7802).</description>
    <link>https://dev.to/ishikathakur7802</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3839822%2F7c9e3570-2c04-49fa-a0ce-660069b566bf.png</url>
      <title>DEV Community: Ishika Thakur</title>
      <link>https://dev.to/ishikathakur7802</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ishikathakur7802"/>
    <language>en</language>
    <item>
      <title>Building PackageGuard: Dependency Traversal, External APIs, and Explainable Risk Scoring in TypeScript</title>
      <dc:creator>Ishika Thakur</dc:creator>
      <pubDate>Thu, 15 Oct 2026 13:09:51 +0000</pubDate>
      <link>https://dev.to/ishikathakur7802/building-packageguard-dependency-traversal-external-apis-and-explainable-risk-scoring-in-2hmf</link>
      <guid>https://dev.to/ishikathakur7802/building-packageguard-dependency-traversal-external-apis-and-explainable-risk-scoring-in-2hmf</guid>
      <description>&lt;h2&gt;
  
  
  First, what exactly is PackageGuard?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PackageGuard is a TypeScript command-line tool that scans a Node.js project's dependencies and flags packages that may deserve security scrutiny.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The problem it addresses is dependency risk.&lt;/p&gt;

&lt;p&gt;Imagine you're building a backend service. You install a package to make an HTTP request, parse a file, or handle authentication. That package may itself depend on other packages, and those packages may have dependencies of their own.&lt;br&gt;
Your application therefore relies on more code than the code you wrote personally.&lt;/p&gt;

&lt;p&gt;Some packages might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recently published, with little history.&lt;/li&gt;
&lt;li&gt;Downloaded very infrequently.&lt;/li&gt;
&lt;li&gt;Missing repository information.&lt;/li&gt;
&lt;li&gt;Configured with installation scripts that execute during installation.&lt;/li&gt;
&lt;li&gt;No longer available in the npm registry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These characteristics do not automatically mean a package is malicious. However, they can help identify dependencies that deserve further investigation.&lt;/p&gt;

&lt;p&gt;PackageGuard uses a set of heuristics to assign risk scores to dependencies and summarizes their severity.&lt;/p&gt;

&lt;p&gt;The important distinction is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PackageGuard is a dependency-risk triage tool, not a malware detector. It helps prioritize investigation; it does not prove that a package is safe or malicious.&lt;/p&gt;
&lt;/blockquote&gt;

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

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

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

&lt;h2&gt;
  
  
  What each component does?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Component 1 — CLI entry point&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a command-line interface using TypeScript and Commander.&lt;br&gt;
The user runs:&lt;br&gt;
node dist/index.js scan&lt;/p&gt;

&lt;p&gt;The dist directory contains the compiled JavaScript output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Commander?&lt;/strong&gt;&lt;br&gt;
Commander helps define commands, arguments, options, and command-line help without requiring you to write all the argument parsing yourself.&lt;/p&gt;

&lt;p&gt;Engineering decision: use an existing CLI library rather than spending the project building a custom command parser.&lt;/p&gt;

&lt;p&gt;Commander handles the interface, but it does not perform the dependency scan or calculate the risk score. Those are application responsibilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component 2 — Project and dependency discovery&lt;/strong&gt;&lt;br&gt;
PackageGuard needs to know which packages to evaluate.&lt;br&gt;
Consider this hypothetical package.json:&lt;br&gt;
{&lt;br&gt;
  "dependencies": {&lt;br&gt;
    "express": "^5.0.0",&lt;br&gt;
    "axios": "^1.0.0"&lt;br&gt;
  },&lt;br&gt;
  "devDependencies": {&lt;br&gt;
    "typescript": "^5.0.0"&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;These are the dependencies declared by the project.&lt;br&gt;
But there's a complication: express and axios can have their own dependencies.&lt;/p&gt;

&lt;p&gt;PackageGuard traverses the installed node_modules tree recursively, with a maximum traversal depth of five and a duplicate guard.&lt;br&gt;
Three concepts matter here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recursion: a function can call itself to explore nested dependencies.&lt;/li&gt;
&lt;li&gt;Depth limit: restricts how far traversal proceeds.&lt;/li&gt;
&lt;li&gt;Duplicate guard: tracks packages already visited so repeated encounters don't cause redundant traversal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why do this?&lt;/strong&gt;&lt;br&gt;
Without a depth limit, a malformed or unusually deep directory structure could consume excessive resources. Without a duplicate guard, shared dependencies might be revisited repeatedly.&lt;br&gt;
There is a trade-off: a depth limit of five bounds work but can miss dependencies deeper in the tree. A duplicate guard also needs to use an appropriate package identity; two versions of the same package are not necessarily interchangeable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;: package.json describes declared dependencies, while node_modules reflects the installed layout. They answer related but different questions. My implementation uses dependency information and recursively examines the installed tree; before claiming exact coverage of every declared, optional, peer, or platform-specific dependency, we should verify the traversal code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component 3 — External npm APIs&lt;/strong&gt;&lt;br&gt;
Once a package has been identified, PackageGuard gathers evidence from npm.&lt;br&gt;
It uses two sources for different kinds of information:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm Registry API&lt;/strong&gt;&lt;br&gt;
Retrieves package metadata, such as whether a package exists, publication information, repository information, and package configuration details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm Downloads API&lt;/strong&gt;&lt;br&gt;
Provides download statistics used as a popularity signal.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*&lt;em&gt;Why use external APIs instead of looking only at local files?&lt;br&gt;
*&lt;/em&gt;&lt;/em&gt;&lt;br&gt;
A local dependency directory can tell you what is installed, but it cannot reliably tell you the package's current registry status, its wider popularity, or all the metadata used by your scoring rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Why two APIs rather than one?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Because package metadata and download statistics are different categories of evidence. Separating the sources makes their roles clearer and lets the analyzer reason about different signals.&lt;/p&gt;

&lt;p&gt;This introduces an engineering trade-off: better evidence comes with network latency and external failure modes.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The registry may be unavailable.&lt;/li&gt;
&lt;li&gt;A request might time out.&lt;/li&gt;
&lt;li&gt;A response could be malformed.&lt;/li&gt;
&lt;li&gt;Rate limits could affect scanning.&lt;/li&gt;
&lt;li&gt;Package metadata could change between scans.
We should inspect the actual HTTP-client and error-handling code before claiming that all of these cases are handled robustly. Using an API does not automatically mean you have implemented retries, caching, concurrency limits, or graceful degradation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Component 4 — Risk analyzer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the decision-making core of PackageGuard.&lt;br&gt;
Instead of displaying raw npm metadata and expecting the developer to interpret it, the analyzer converts evidence into a numerical score.&lt;/p&gt;

&lt;p&gt;The known heuristic rules are:&lt;/p&gt;

&lt;p&gt;Signal  Score contribution&lt;br&gt;
Package is very new: under 7 days old   +30&lt;br&gt;
Fewer than 100 downloads per week   +20&lt;br&gt;
Repository information missing  +15&lt;br&gt;
Installation scripts present    +20&lt;br&gt;
Package does not exist in the registry  Directly assigned 100&lt;/p&gt;

&lt;p&gt;The score is capped at 100. The thresholds are:&lt;br&gt;
Score   Severity&lt;br&gt;
0–29  LOW&lt;br&gt;
30–59 MEDIUM&lt;br&gt;
60–79 HIGH&lt;br&gt;
80–100    CRITICAL&lt;/p&gt;

&lt;p&gt;Let's calculate a hypothetical example.&lt;/p&gt;

&lt;p&gt;Suppose a package is three days old, has fewer than 100 weekly downloads, and has no repository information.&lt;br&gt;
[&lt;br&gt;
R = 30 + 20 + 15 = 65&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Its score would be 65, placing it in the HIGH category.&lt;/p&gt;

&lt;p&gt;There is another important case. A package that doesn't exist in the registry is assigned a score of 100 directly. That is different from adding the ordinary signal contributions together.&lt;/p&gt;

&lt;p&gt;Why?&lt;br&gt;
A package that cannot be found may be a typo, an unpublished package, a removed package, a private-registry dependency, or something else. It is a significant finding, but the score alone does not establish malicious intent.&lt;/p&gt;

&lt;p&gt;The trade-off is that the rules are crude. Legitimate new packages can score highly, while malicious packages can have many downloads and complete metadata.&lt;/p&gt;

&lt;p&gt;The exact aggregation, missing-data handling, and precedence of the individual rules should be confirmed against the source before we make stronger claims about them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Component 5 — Reporting&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The last stage converts the analyzer's findings into something a developer can act on.&lt;/p&gt;

&lt;p&gt;Instead of forcing the user to examine multiple API responses for every package, PackageGuard summarizes the findings by risk and severity.&lt;br&gt;
The value of the report is not simply that it contains a score. It makes a potentially large set of dependency metadata easier to prioritize.&lt;/p&gt;

&lt;p&gt;A strong report should help answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which packages deserve attention first?&lt;/li&gt;
&lt;li&gt;What evidence triggered the warning?&lt;/li&gt;
&lt;li&gt;What should the developer investigate next?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first is supported by the scoring and severity levels. The second depends on how much explanatory detail the report exposes. The third is an area where a future version could offer remediation guidance.&lt;/p&gt;

&lt;p&gt;PackageGuard started as an idea about npm dependency visibility. It became an opportunity to work through the full lifecycle of a small developer tool: defining the problem, dividing responsibilities, building modules, connecting to an external service, implementing explainable rules, testing, packaging, publishing, and validating the result.&lt;/p&gt;

&lt;p&gt;The most valuable lesson was that shipping software requires more than making the happy path work.&lt;/p&gt;

&lt;p&gt;You need to think about what the program knows, what it doesn't know, how its parts interact, how users invoke it, and how to communicate the limits of its output.&lt;/p&gt;

&lt;p&gt;PackageGuard is an early experiment, not a complete supply-chain security solution. But it is now a real npm package that other developers can install and try.&lt;/p&gt;

&lt;p&gt;Try it out:&lt;/p&gt;

&lt;p&gt;npm: [&lt;a href="https://www.npmjs.com/package/packageguard" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/packageguard&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Source code: [&lt;a href="https://github.com/ishika-thakur7802/packageguard" rel="noopener noreferrer"&gt;https://github.com/ishika-thakur7802/packageguard&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;I'm looking forward to improving the implementation, strengthening its tests, and learning from what the next iteration reveals.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>api</category>
      <category>npm</category>
      <category>cli</category>
    </item>
    <item>
      <title>PawPal is your New Dog's AI Sidekick 🐶⭐</title>
      <dc:creator>Ishika Thakur</dc:creator>
      <pubDate>Sun, 16 Aug 2026 22:13:40 +0000</pubDate>
      <link>https://dev.to/ishikathakur7802/pawpal-is-your-new-dogs-ai-sidekick-3bc8</link>
      <guid>https://dev.to/ishikathakur7802/pawpal-is-your-new-dogs-ai-sidekick-3bc8</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Bringing a new dog home is exciting... and also confusing.&lt;/p&gt;

&lt;p&gt;Why are they crying?&lt;br&gt;
Why are they hiding?&lt;br&gt;
Why won't they eat?&lt;br&gt;
Why are they biting my feet? 😭&lt;/p&gt;

&lt;p&gt;I built PawPal, a playful AI companion for new dog owners that helps turn those confusing moments into simple, reassuring guidance.&lt;/p&gt;

&lt;p&gt;I especially wanted PawPal to feel useful for people welcoming a rescued dog into their home, where a new environment can be overwhelming for both the dog and the person trying to understand them.&lt;/p&gt;

&lt;p&gt;You describe what's happening, and PawPal explains what might be going on, suggests a few things you can try, and gives you a playful "What your dog really means" translation.&lt;/p&gt;

&lt;p&gt;And then... you can actually hear your dog say it. 🐶🔊&lt;/p&gt;

&lt;p&gt;PawPal isn't meant to diagnose a dog or replace a veterinarian. It's a friendly first step for a confused human trying to understand their new companion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;🐾 Try PawPal:&lt;br&gt;
&lt;a href="https://pawpalweb.netlify.app/" rel="noopener noreferrer"&gt;https://pawpalweb.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try asking:&lt;/p&gt;

&lt;p&gt;"My rescued puppy keeps hiding under the bed. What should I do?"&lt;/p&gt;

&lt;p&gt;Then listen to "What your dog really means." 🐶&lt;/p&gt;

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

&lt;p&gt;The project is open source:&lt;br&gt;
&lt;a href="https://github.com/ishika-thakur7802/pawpal" rel="noopener noreferrer"&gt;https://github.com/ishika-thakur7802/pawpal&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;PawPal is a small React/Vite application backed by Netlify serverless functions.&lt;/p&gt;

&lt;p&gt;The basic flow is:&lt;/p&gt;

&lt;p&gt;User → React UI → Netlify Function → Google Gemini → PawPal response&lt;/p&gt;

&lt;p&gt;For the voice experience:&lt;/p&gt;

&lt;p&gt;PawPal response → ElevenLabs → audio → user&lt;/p&gt;

&lt;p&gt;I used Google Gemini to generate the personalized responses. The prompt gives PawPal a specific personality and structure so that responses stay concise, friendly, practical, and appropriate for someone who may be a first-time dog owner.&lt;/p&gt;

&lt;p&gt;I then used ElevenLabs to turn the playful "What your dog really means" part into speech.&lt;/p&gt;

&lt;p&gt;I kept the project intentionally small. Rather than building a huge pet-management platform, I focused on one interaction:&lt;/p&gt;

&lt;p&gt;"I don't understand what my dog is doing. Help."&lt;/p&gt;

&lt;p&gt;The rescued-dog prompts were also designed to require no additional backend complexity — they simply give new adopters useful starting questions.&lt;/p&gt;

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

&lt;p&gt;🌟 Best Use of Google AI&lt;/p&gt;

&lt;p&gt;PawPal uses Google Gemini as the core reasoning layer.&lt;/p&gt;

&lt;p&gt;Gemini takes the owner's description of what's happening and generates a personalized response with:&lt;/p&gt;

&lt;p&gt;what might be happening&lt;br&gt;
practical things the owner can try&lt;br&gt;
when professional help may be appropriate&lt;br&gt;
a playful interpretation from the dog's perspective&lt;/p&gt;

&lt;p&gt;The AI isn't just decorating the interface — the main purpose of PawPal depends on it.&lt;/p&gt;

&lt;p&gt;🌟 Best Use of ElevenLabs&lt;/p&gt;

&lt;p&gt;ElevenLabs powers PawPal's voice experience.&lt;/p&gt;

&lt;p&gt;After Gemini generates the dog's playful "translation," ElevenLabs turns it into audio so the user can hear what their dog is supposedly trying to say. 🐶&lt;/p&gt;

&lt;p&gt;That was important to me because the interaction should feel fun rather than like filling out another AI form.&lt;/p&gt;

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

&lt;p&gt;I wanted to make something that could be genuinely useful during those first confusing days of having a new dog — especially when that dog has come from a rescue situation and both sides are still learning to trust each other.&lt;/p&gt;

&lt;p&gt;Sometimes you don't need another complicated pet platform.&lt;/p&gt;

&lt;p&gt;You just need someone to say:&lt;/p&gt;

&lt;p&gt;"Okay. Your dog is probably trying to tell you something. Let's figure it out." 🐾&lt;/p&gt;

&lt;p&gt;Built for the DEV Weekend Challenge: Dog Days Edition.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building eXtab #1: The Problem</title>
      <dc:creator>Ishika Thakur</dc:creator>
      <pubDate>Mon, 13 Jul 2026 07:23:18 +0000</pubDate>
      <link>https://dev.to/ishikathakur7802/building-extab-1-the-problem-2pio</link>
      <guid>https://dev.to/ishikathakur7802/building-extab-1-the-problem-2pio</guid>
      <description>&lt;p&gt;&lt;strong&gt;how many tabs are currently open in your window?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;how many do you remember the context for?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;if you're a fellow techie too, i know you too have been through one of those days with an endless number of tabs open in the window and having no clue where the music is coming from?&lt;/p&gt;

&lt;p&gt;Hi there, I'm Ishika and I faced the same problem. It actually became crazy when I started working in the Incident Response Team. There would be duplicate tabs of logs, dashboards, documentations and so much more.&lt;/p&gt;

&lt;p&gt;I could have just closed the window- but ouch! it'd have definitely hurt. :(&lt;/p&gt;

&lt;p&gt;the emotional attachment to my tabs led me to build &lt;strong&gt;eXtab&lt;/strong&gt;-&lt;br&gt;
&lt;em&gt;a smart chrome extension that sits on your window and helps you understand your tabs better&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;why a chrome extension?&lt;br&gt;
honestly:&lt;br&gt;
A. not one more tab please&lt;br&gt;
B. i'm genuinely intrigued by how powerful but how underrated web extensions are!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;so the current techstack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript (ES6)&lt;/li&gt;
&lt;li&gt;Chrome Extensions Manifest V3&lt;/li&gt;
&lt;li&gt;Chrome Tabs API&lt;/li&gt;
&lt;li&gt;Chrome Storage API&lt;/li&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05zg17w6rewr3xbc1int.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05zg17w6rewr3xbc1int.png" alt="basic architechture of eXtab" width="555" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Current Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read All Open Tabs&lt;/strong&gt;&lt;br&gt;
Displays every currently open browser tab.&lt;/p&gt;

&lt;p&gt;Reads tab title&lt;br&gt;
Reads tab URL&lt;br&gt;
Retrieves all open tabs using the Chrome Tabs API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detect Duplicate Tabs&lt;/strong&gt;&lt;br&gt;
Identifies duplicate tabs based on their URLs.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;YouTube&lt;br&gt;
YouTube&lt;br&gt;
YouTube&lt;/p&gt;

&lt;p&gt;↓&lt;/p&gt;

&lt;p&gt;Duplicate found (3)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remove Duplicate Tabs&lt;/strong&gt;&lt;br&gt;
Automatically closes duplicate tabs while preserving one instance.&lt;/p&gt;

&lt;p&gt;This helps reduce browser clutter without manually searching for duplicates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show Idle Tabs (4h+)&lt;/strong&gt;&lt;br&gt;
Tracks browser activity and lists tabs that haven't been accessed for more than 4 hours.&lt;/p&gt;

&lt;p&gt;Displays:&lt;/p&gt;

&lt;p&gt;Tab title&lt;br&gt;
Idle duration&lt;br&gt;
Number of idle tabs detected&lt;br&gt;
Example:&lt;/p&gt;

&lt;p&gt;Number of Idle Tabs: 9&lt;/p&gt;

&lt;p&gt;YouTube — Idle for 20 hours&lt;br&gt;
Pinterest — Idle for 20 hours&lt;br&gt;
LeetCode — Idle for 22 hours&lt;/p&gt;

&lt;p&gt;The user can then either navigate to the tab, close the tab or review the tab.&lt;/p&gt;

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

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

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

</description>
      <category>programming</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>extensions</category>
    </item>
  </channel>
</rss>
