<?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: Misbah Bagwan</title>
    <description>The latest articles on DEV Community by Misbah Bagwan (@misbah_bagwan).</description>
    <link>https://dev.to/misbah_bagwan</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%2F4187324%2F9e29aad9-ee99-4e5b-8f1e-9903b856dfe4.png</url>
      <title>DEV Community: Misbah Bagwan</title>
      <link>https://dev.to/misbah_bagwan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/misbah_bagwan"/>
    <language>en</language>
    <item>
      <title>Command Casperr: a tiny hand-drawn ghost that haunts your PowerShell terminal 👻</title>
      <dc:creator>Misbah Bagwan</dc:creator>
      <pubDate>Sun, 01 Nov 2026 00:05:56 +0000</pubDate>
      <link>https://dev.to/misbah_bagwan/command-casperr-a-tiny-hand-drawn-ghost-that-haunts-your-powershell-terminal-3251</link>
      <guid>https://dev.to/misbah_bagwan/command-casperr-a-tiny-hand-drawn-ghost-that-haunts-your-powershell-terminal-3251</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;Command Casper&lt;/strong&gt;, a tiny hand-drawn ghost that floats on your screen and haunts your PowerShell terminal.&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%2Fv1u0m1ljosq5exx9b8ws.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%2Fv1u0m1ljosq5exx9b8ws.png" alt=" " width="285" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You type a command but don't press Enter. You press &lt;strong&gt;Alt+G&lt;/strong&gt;. Casper looks at what you typed and turns &lt;strong&gt;green&lt;/strong&gt;, &lt;strong&gt;yellow&lt;/strong&gt; or &lt;strong&gt;red&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 &lt;strong&gt;Green:&lt;/strong&gt; it only reads things.&lt;/li&gt;
&lt;li&gt;🟡 &lt;strong&gt;Yellow:&lt;/strong&gt; it changes something, but you can usually undo it (installs, copies, a git commit).&lt;/li&gt;
&lt;li&gt;🔴 &lt;strong&gt;Red:&lt;/strong&gt; it destroys something or is hard to undo (deletes, overwrites, &lt;code&gt;--force&lt;/code&gt;, download-and-run).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhi7m789ao5rqyxp7pmk9.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%2Fhi7m789ao5rqyxp7pmk9.png" alt=" " width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;This is how casperr reacts when you ask it to evaluate a command !&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click the ghost and a speech bubble opens with a plain-English explanation, plus real facts about your actual folder: "this folder has 7 files, all edited today."&lt;/p&gt;

&lt;p&gt;The theme gave me a perfect starting point. One of the example ideas on the challenge page was a haunted terminal that "possesses your shell." I wanted a friendly haunting, though. Casper isn't there to scare you. He's the ghost that says "hold up, human bean, think this through" right before you wipe a folder.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm fairly new to all of this, so I kept two rules:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It never blocks Enter and never runs your command.&lt;/strong&gt; It only looks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The AI never decides the colour.&lt;/strong&gt; More on that below, because it's the most important design choice in the project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fun detail: the ghost is original pixel art i took from a template and enhanced myself (the rosy cheeks , the pink bow and ofcourse the signs !)&lt;/p&gt;

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

&lt;p&gt;Below is the video where you will catch casperr shaking cause of a delete command !&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ZltIg_v0IUQ" width="710" height="399"&gt;
  &lt;/iframe&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%2Fsh56nhb43izszitn03zh.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%2Fsh56nhb43izszitn03zh.png" alt=" " width="588" height="479"&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%2F0ttgb0slpows26m051cz.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%2F0ttgb0slpows26m051cz.png" alt=" " width="800" height="268"&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%2Fwmbce8n9wxn4z0t5foua.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%2Fwmbce8n9wxn4z0t5foua.png" alt=" " width="799" height="408"&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%2Fm1xtmrbq6jlx7slhzpxp.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%2Fm1xtmrbq6jlx7slhzpxp.png" alt=" " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Summon him and release him like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D:\ghost\ghost.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nx"&gt;casperr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;summon&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c"&gt;# "Casperr has been summoned!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;casperr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;release&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c"&gt;# "Casperr has returned to the ghost realm!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;When summoned, he drops in from above and settles. When released, he does the same thing in reverse and fades away. Green bobs slowly, yellow a bit quicker, and red is frantic, because red should feel a little panicky.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/bagwanmisbah" rel="noopener noreferrer"&gt;
        bagwanmisbah
      &lt;/a&gt; / &lt;a href="https://github.com/bagwanmisbah/CommandCasper-Ghost-in-the-Machine" rel="noopener noreferrer"&gt;
        CommandCasper-Ghost-in-the-Machine
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;👻 Command Casperr&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;A tiny hand-drawn ghost that haunts your PowerShell and warns you before you press Enter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Type a command (don't press Enter), press &lt;strong&gt;Alt+G&lt;/strong&gt;, and Casperr turns &lt;strong&gt;green&lt;/strong&gt;, &lt;strong&gt;yellow&lt;/strong&gt; or &lt;strong&gt;red&lt;/strong&gt;. Click him for a plain-English explanation plus real facts about your folder.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26" rel="nofollow"&gt;Hacktoberfest Open-Source AI Challenge, Week 4: Ghost in the Machine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;🟢 Green&lt;/th&gt;

&lt;th&gt;🟡 Yellow&lt;/th&gt;

&lt;th&gt;🔴 Red&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;Only reads things&lt;/td&gt;

&lt;td&gt;Changes something, usually recoverable (installs, copies, &lt;code&gt;git commit&lt;/code&gt;)&lt;/td&gt;

&lt;td&gt;Destroys or is hard to undo (deletes, overwrites, &lt;code&gt;--force&lt;/code&gt;, download-and-run)&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The one rule that matters&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The rules decide the colour. The AI never does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The colour comes from a plain, editable &lt;a href="https://github.com/bagwanmisbah/CommandCasper-Ghost-in-the-Machine/rules.json" rel="noopener noreferrer"&gt;&lt;code&gt;rules.json&lt;/code&gt;&lt;/a&gt; and a small deterministic engine (aliases, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; chains where the worst command wins, quotes, &lt;code&gt;&amp;gt;&lt;/code&gt; vs &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;-WhatIf&lt;/code&gt; making a command green, unknown commands default to yellow). The AI (Gemma 4, an open-weight model) is told…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/bagwanmisbah/CommandCasper-Ghost-in-the-Machine" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;&lt;strong&gt;The model:&lt;/strong&gt; Gemma 4 26B (&lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt;), an open-weight model, served through Google AI Studio's free tier. No credit card, no cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most important decision: rules pick the colour, the AI only explains.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My first instinct was "let the model judge the command." But a model that can be talked into a different answer is a bad safety guard. So the colour comes from a plain, editable &lt;code&gt;rules.json&lt;/code&gt; and a small rule engine: aliases, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; chains (the worst command in the chain wins), quotes, &lt;code&gt;&amp;gt;&lt;/code&gt; vs &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;, and &lt;code&gt;-WhatIf&lt;/code&gt; making a command green. Anything unknown defaults to yellow. It's deterministic: same input, same colour, every time.&lt;/p&gt;

&lt;p&gt;I tested the engine on &lt;strong&gt;114 commands (37 green, 33 yellow, 44 red)&lt;/strong&gt; and all pass. The tests also run automatically on every push with GitHub Actions.&lt;/p&gt;

&lt;p&gt;The AI arrives afterwards. The bubble opens instantly with template text, then Gemma's explanation fades in a moment later from a background thread. The prompt tells it the verdict is final:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The verdict is RED and it is final. Never contradict it, never change it. Use ONLY the facts given below."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It only receives the command, the verdict with its reasons, and counts or sizes ("7 files, 18.6 KB"). Never file contents.&lt;/p&gt;

&lt;p&gt;If there's no key, no internet, or the API errors out, the bubble just shows the template text. The tool never breaks.&lt;/p&gt;

&lt;p&gt;Other bits: &lt;br&gt;
Windows PowerShell 5.1 with one PSReadLine key binding, a small tkinter window, and a plain UDP message to &lt;code&gt;127.0.0.1&lt;/code&gt; between the two. &lt;br&gt;
The hook lives in the current terminal session only, with no &lt;code&gt;$PROFILE&lt;/code&gt; edits and nothing installed system-wide. &lt;br&gt;
The AI part is pure Python standard library, so there's nothing to &lt;code&gt;pip install&lt;/code&gt;. Everything lives in one folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the model says
&lt;/h3&gt;

&lt;p&gt;Same prompt, the rules choose the colour, Gemma 4 26B writes the explanation:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Rules said&lt;/th&gt;
&lt;th&gt;Gemma 4 26B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pip install requests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;"This command installs Python packages by downloading code from the internet. Because it downloads new files to your system, it is marked as YELLOW."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Copy-Item .\rules.json .\rules.bak&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡&lt;/td&gt;
&lt;td&gt;"This command copies the file rules.json, which is 18.6 KB and was edited today, to a new backup file. This action is marked YELLOW because it copies files or folders."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Remove-Item .\art -Recurse -Force&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;"This command will delete the folder named .\art and everything inside it. This folder contains 7 files that were edited today. This action is permanent and cannot be undone."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;iwr https://example.com/setup.ps1&lt;/code&gt; piped into &lt;code&gt;iex&lt;/code&gt; (download and run)&lt;/td&gt;
&lt;td&gt;🔴&lt;/td&gt;
&lt;td&gt;"This command downloads a script from the internet and runs it immediately. You cannot see what the code will do before it executes on your computer. This is dangerous because it can perform unexpected actions without your permission."&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swapping models is one line.&lt;/strong&gt; The model name lives in a &lt;code&gt;.env&lt;/code&gt; setting. Comparing two Gemma sizes took one flag. The code also speaks the common Open ai style request format, so pointing it at another provider or a local server should be a config change. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It cost nothing.&lt;/strong&gt; The whole project runs on a free tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in for the important part.&lt;/strong&gt; The thing that keeps you safe is a JSON file you can read, edit and argue with. The model is a replaceable explainer. If a provider changes its rules, Casper falls back to templates instead of dying.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Spirit of It ( Thoughtfully following the Theme )
&lt;/h2&gt;

&lt;p&gt;Casper is meant to be a gentle kind of spooky. I drew it pixel by pixel, gave it rosy cheeks and a bow and wrote for it lines like "Spooky. Are you sure about this?" and "Watch out, mortal!" The goal was a ghost that makes the scary moment of pressing Enter feel a bit less lonely, and maybe makes you pause for one second before the red command.&lt;/p&gt;

&lt;p&gt;The lines live in a plain &lt;code&gt;personality.json&lt;/code&gt;, so you can rename it and swap "mortal" for anything you like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built by&lt;/strong&gt;&lt;br&gt;
Misbah · Dev: &lt;a class="mentioned-user" href="https://dev.to/misbah_bagwan"&gt;@misbah_bagwan&lt;/a&gt; &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 4 26B writes every explanation, through Google AI Studio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot&lt;/strong&gt;: I used GitHub Copilot in VS Code while building (the repo includes my Copilot instructions file), and the rule tests run automatically on every push with GitHub Actions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built with help from AI assistants (Claude and GitHub Copilot). The design decisions, the art, the rules and the testing are mine.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Music credits: nastelbom-halloween-halloween-music-621496 by Nastelbom, from Pixabay&lt;/p&gt;

&lt;p&gt;Ghost Template credits :PixilArt &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%2Fpz5wnlikn7refwdnic6n.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%2Fpz5wnlikn7refwdnic6n.png" alt=" " width="285" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>gemma</category>
    </item>
    <item>
      <title>Tab Debt: Make Room for What Matters</title>
      <dc:creator>Misbah Bagwan</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:01:17 +0000</pubDate>
      <link>https://dev.to/misbah_bagwan/tab-debt-make-room-for-what-matters-41i1</link>
      <guid>https://dev.to/misbah_bagwan/tab-debt-make-room-for-what-matters-41i1</guid>
      <description>&lt;p&gt;This is a submission for &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;br&gt;
Tab Debt is an AI-assisted Chrome extension that helps clean up inactive and duplicate browser tabs without forcing users to decide manually what to keep.&lt;/p&gt;

&lt;p&gt;Many of us keep dozens of Chrome tabs open “just in case.” Over time, those tabs consume browser resources, occupy screen space, increase cognitive load, and distract us from the task we are currently trying to complete.&lt;/p&gt;

&lt;p&gt;The hardest part is not closing a tab. It is deciding whether the tab might become important later.&lt;/p&gt;

&lt;p&gt;Tab Debt gives users a safer way to let go:&lt;/p&gt;

&lt;p&gt;Users can protect important URLs from cleanup.&lt;br&gt;
The extension scans open tabs across Chrome windows.&lt;br&gt;
Duplicate tabs are detected and removed.&lt;br&gt;
Inactive tabs can be cleaned up.&lt;br&gt;
Before closing tabs, the extension generates a short AI summary for each one.&lt;br&gt;
The summaries are saved as reusable notes.&lt;br&gt;
A JSON ledger of cleaned tabs is downloaded for future reference.&lt;br&gt;
Users can reopen a saved tab whenever they need it again.&lt;br&gt;
The goal is simple: reduce tab clutter while preserving the context users are afraid to lose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project is a Chrome extension, so the recommended demo is a screenshot showing :&lt;/p&gt;

&lt;p&gt;Several duplicate and inactive tabs open.&lt;br&gt;
Important URLs added to the protected list.&lt;br&gt;
The Clean my tabs button being used.&lt;br&gt;
Duplicate or stale tabs being removed.&lt;br&gt;
AI-generated tab summaries appearing in the saved notes section.&lt;br&gt;
The exported tab ledger being downloaded.&lt;br&gt;
Code&lt;br&gt;
The source code is available in the Tab Debt GitHub repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before tab cleaning :-&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%2F8rpsufzz78fexfgothgn.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%2F8rpsufzz78fexfgothgn.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After tab cleaning :-&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%2Fx5glfpy4in1512v9mxmi.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%2Fx5glfpy4in1512v9mxmi.png" alt=" " width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Important parts of the implementation include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Main dashboard&lt;/li&gt;
&lt;li&gt;Tab cleanup logic&lt;/li&gt;
&lt;li&gt;Protected-tab filtering&lt;/li&gt;
&lt;li&gt;Background cleanup service&lt;/li&gt;
&lt;li&gt;Gemma summarization integration&lt;/li&gt;
&lt;li&gt;Chrome extension manifest&lt;/li&gt;
&lt;li&gt;Storage utilities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/Farkhanda-Dalal/TAB_DEBT" rel="noopener noreferrer"&gt;https://github.com/Farkhanda-Dalal/TAB_DEBT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I Built It&lt;/strong&gt;&lt;br&gt;
Tab Debt is built as a Manifest V3 Chrome extension using:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Vite&lt;/li&gt;
&lt;li&gt;Chrome Extensions APIs&lt;/li&gt;
&lt;li&gt;Chrome Storage API&lt;/li&gt;
&lt;li&gt;Chrome Tabs API&lt;/li&gt;
&lt;li&gt;Chrome Scripting API&lt;/li&gt;
&lt;li&gt;Chrome Downloads API&lt;/li&gt;
&lt;li&gt;Gemma 2 2B IT&lt;/li&gt;
&lt;li&gt;Hugging Face Inference API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interface is built with React and TypeScript. Vite provides the development and build workflow, while the Chrome Manifest V3 service worker handles the cleanup operation in the background.&lt;/p&gt;

&lt;p&gt;The extension works in the following way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The user adds important URLs to an “untouchable” list.&lt;/li&gt;
&lt;li&gt;The background service queries open Chrome tabs.&lt;/li&gt;
&lt;li&gt;Active tabs, protected URLs, extension pages, and tabs without usable URLs are excluded.&lt;/li&gt;
&lt;li&gt;Remaining tabs are grouped by URL to identify duplicates.&lt;/li&gt;
&lt;li&gt;Inactive or duplicate tabs are selected for cleanup.&lt;/li&gt;
&lt;li&gt;The extension extracts a limited amount of visible page text.&lt;/li&gt;
&lt;li&gt;The page title and extracted text are sent to Gemma.&lt;/li&gt;
&lt;li&gt;Gemma produces a concise one-sentence summary.&lt;/li&gt;
&lt;li&gt;The summary and original URL are stored as a saved note.&lt;/li&gt;
&lt;li&gt;The tab is closed and a JSON ledger is downloaded so the user can recover the cleaned-up context.&lt;/li&gt;
&lt;li&gt;We chose open-source and open-weight tools because the project is fundamentally about user control and reducing unnecessary complexity. React, TypeScript, Vite, and the Chrome extension platform provided a lightweight foundation. Gemma gave us a compact language model capable of summarizing pages without requiring us to build a model from scratch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Open Innovation Matters&lt;/strong&gt;&lt;br&gt;
This is a problem many of our friends and teammates struggle with. We keep tabs open because we are afraid that closing one means losing an important idea, reference, task, or piece of research.&lt;/p&gt;

&lt;p&gt;The result is a browser full of unfinished decisions.&lt;/p&gt;

&lt;p&gt;Open innovation made it possible to combine several accessible technologies into a focused tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An open web extension platform for controlling browser tabs.&lt;/li&gt;
&lt;li&gt;Open-source frontend tooling for building a lightweight interface.&lt;/li&gt;
&lt;li&gt;An open-weight AI model for generating summaries.&lt;/li&gt;
&lt;li&gt;Local browser storage for keeping protected URLs and saved notes.&lt;/li&gt;
&lt;li&gt;A transparent JSON ledger that users can inspect and keep themselves.&lt;/li&gt;
&lt;li&gt;A closed API could provide summarization, but open innovation gives us more flexibility over how the complete workflow is designed. We can decide what data is sent for summarization, how much page content is extracted, how protected tabs are handled, and how users recover their information after cleanup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, the user is not forced to choose between keeping every tab open and losing everything. Tab Debt preserves a lightweight memory of the tab before closing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Lazy Payoff&lt;/strong&gt;&lt;br&gt;
Suppose a user has 20 tabs to review and spends approximately 3–4 minutes thinking through each tab:&lt;/p&gt;

&lt;p&gt;20 tabs × 3 minutes = 60 minutes&lt;br&gt;
20 tabs × 4 minutes = 80 minutes&lt;br&gt;
That means manually deciding what to keep can consume approximately 1–1.3 hours.&lt;/p&gt;

&lt;p&gt;With Tab Debt, the user can maintain a protected list, click one button, and let the cleanup service identify duplicates and inactive tabs. If the cleanup takes approximately 1–2 minutes, the estimated saving is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;58–79 minutes saved&lt;br&gt;
Approximately 97.5%–98.3% less decision time&lt;/strong&gt;&lt;br&gt;
For a general estimate, Tab Debt can reduce the manual tab-review effort by roughly 95%–98%, depending on the number of tabs and how long the user normally spends evaluating each one.&lt;/p&gt;

&lt;p&gt;The extension currently measures tabs scanned, duplicates closed, and protected tabs skipped. It reduces tab count and browser clutter, Therefore, the RAM benefit should be described as an expected reduction in browser resource pressure rather than a measured number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built by&lt;/strong&gt;&lt;br&gt;
Farkhanda · Dev: &lt;a class="mentioned-user" href="https://dev.to/7farkhanda"&gt;@7farkhanda&lt;/a&gt; &lt;br&gt;
Misbah · Dev: &lt;a class="mentioned-user" href="https://dev.to/misbah_bagwan"&gt;@misbah_bagwan&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prize Categories&lt;/strong&gt;&lt;br&gt;
Gemma&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
