<?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: Nitin Kumar Yadav</title>
    <description>The latest articles on Forem by Nitin Kumar Yadav (@nitinkumaryadav1307).</description>
    <link>https://forem.com/nitinkumaryadav1307</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%2F3728348%2Fc4d0b99f-ce87-4b39-88ec-7254012820f5.jpeg</url>
      <title>Forem: Nitin Kumar Yadav</title>
      <link>https://forem.com/nitinkumaryadav1307</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nitinkumaryadav1307"/>
    <language>en</language>
    <item>
      <title>Courage Browser — 1 month Later: CSS Variables, Tabs, Link Navigation &amp; More</title>
      <dc:creator>Nitin Kumar Yadav</dc:creator>
      <pubDate>Sat, 09 May 2026 16:25:47 +0000</pubDate>
      <link>https://forem.com/nitinkumaryadav1307/courage-browser-1-month-later-css-variables-tabs-link-navigation-more-5fh8</link>
      <guid>https://forem.com/nitinkumaryadav1307/courage-browser-1-month-later-css-variables-tabs-link-navigation-more-5fh8</guid>
      <description>&lt;p&gt;1 month ago I posted about building a browser from scratch — no Chromium, no WebKit, no libraries. Just Node.js, Electron, and a Canvas to draw on.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Missed Part 1?&lt;/strong&gt; → &lt;a href="https://dev.to/nitinkumaryadav1307/i-built-a-web-browser-from-scratch-in-42-days-no-libraries-just-nodejs-416h"&gt;"I Built a Web Browser from Scratch in 42 Days"&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That post covered the first 42 days: raw TCP connections, HTML tokenizer, DOM builder, CSS parser, layout engine, and a working Canvas renderer. Basic text showed up. It was exciting but rough.&lt;/p&gt;

&lt;p&gt;Since then — &lt;strong&gt;approximately 30 more days of building&lt;/strong&gt;. Here's what Courage can do now.&lt;/p&gt;




&lt;h2&gt;
  
  
  🆕 What shipped in Days 43–57
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tabs
&lt;/h3&gt;

&lt;p&gt;The most visually obvious change. Courage now has a working tab system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; button creates a new tab&lt;/li&gt;
&lt;li&gt;Each tab maintains its own history, URL, and rendered page&lt;/li&gt;
&lt;li&gt;Clicking a tab switches context; the &lt;code&gt;×&lt;/code&gt; button closes it&lt;/li&gt;
&lt;li&gt;Active tab is highlighted&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.amazonaws.com%2Fuploads%2Farticles%2Fehkoczx7ccubtn2cax8i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fehkoczx7ccubtn2cax8i.gif" alt="Courage Browser tab system" width="600" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every tab is fully independent — opening a link in a new tab doesn't share state with others.&lt;/p&gt;




&lt;h3&gt;
  
  
  Clickable Links (Anchor Navigation)
&lt;/h3&gt;

&lt;p&gt;This one took the most debugging. The challenge: Canvas 2D has no DOM events — I had to implement my own hit-testing.&lt;/p&gt;

&lt;p&gt;When you click the canvas, Courage:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gets the click coordinates via &lt;code&gt;canvas.getBoundingClientRect()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Walks the layout boxes looking for an anchor whose bounding rect contains that point&lt;/li&gt;
&lt;li&gt;If found, navigates to the &lt;code&gt;href&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also added a &lt;strong&gt;pointer cursor&lt;/strong&gt; on hover — &lt;code&gt;mousemove&lt;/code&gt; triggers the same hit-test, and if the cursor is over a link, &lt;code&gt;cursor: pointer&lt;/code&gt; is set on the canvas element. Small detail, huge feel difference.&lt;/p&gt;




&lt;h3&gt;
  
  
  External CSS Fetching
&lt;/h3&gt;

&lt;p&gt;Before Day 44, Courage only read &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; blocks inline. Now it fetches external stylesheets — it looks for &lt;code&gt;&amp;lt;link rel="stylesheet"&amp;gt;&lt;/code&gt; tags in the DOM, fires a second HTTP request for each one, and merges the rules into the cascade. This is what made real sites start to look like real sites.&lt;/p&gt;




&lt;h3&gt;
  
  
  Class &amp;amp; ID Selector Matching
&lt;/h3&gt;

&lt;p&gt;Added proper &lt;code&gt;.className&lt;/code&gt; and &lt;code&gt;#idName&lt;/code&gt; selector support. Before this, only tag selectors (&lt;code&gt;h1&lt;/code&gt;, &lt;code&gt;p&lt;/code&gt;, &lt;code&gt;a&lt;/code&gt;) worked. Now the full selector matching order is:&lt;br&gt;
tag → class → ID → pseudo-class (:link, :visited)&lt;/p&gt;


&lt;h3&gt;
  
  
  CSS &lt;code&gt;var()&lt;/code&gt; Resolution — The Big One
&lt;/h3&gt;

&lt;p&gt;GitHub, Wikipedia, and most modern sites define their entire color scheme using CSS custom properties like &lt;code&gt;--color-fg-default&lt;/code&gt; on &lt;code&gt;:root&lt;/code&gt;. Without &lt;code&gt;var()&lt;/code&gt; support, everything was either black or invisible.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A new &lt;code&gt;computed-styles.js&lt;/code&gt; module with a &lt;code&gt;getComputedStyle()&lt;/code&gt; function&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;:root&lt;/code&gt; selector support so variables defined globally actually register&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parentNode&lt;/code&gt; references in &lt;code&gt;dom-builder.js&lt;/code&gt; so the resolver walks up the tree correctly&lt;/li&gt;
&lt;li&gt;Pipeline wiring in &lt;code&gt;browser.js&lt;/code&gt; to run computed styles after selector matching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The resolver works recursively — &lt;code&gt;var(--x)&lt;/code&gt; where &lt;code&gt;--x&lt;/code&gt; is itself &lt;code&gt;var(--y)&lt;/code&gt; chains correctly.&lt;/p&gt;


&lt;h3&gt;
  
  
  UA Stylesheet + &lt;code&gt;em&lt;/code&gt; Units + Bold/Italic
&lt;/h3&gt;

&lt;p&gt;Three smaller but visible wins:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UA stylesheet:&lt;/strong&gt; Added browser default styles — &lt;code&gt;h1&lt;/code&gt; is now big and bold, &lt;code&gt;h2&lt;/code&gt; slightly smaller, etc. Before this, every element rendered the same size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;em&lt;/code&gt; units:&lt;/strong&gt; Font sizes expressed as &lt;code&gt;1.5em&lt;/code&gt; or &lt;code&gt;2em&lt;/code&gt; now compute correctly via a &lt;code&gt;headingSizes&lt;/code&gt; lookup table relative to the parent's font size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bold/italic fix:&lt;/strong&gt; The Canvas &lt;code&gt;ctx.font&lt;/code&gt; string has a strict format — &lt;code&gt;bold 16px serif&lt;/code&gt; works, &lt;code&gt;16px bold serif&lt;/code&gt; does not. Fixed a bug where both were silently ignored even when the styles matched correctly.&lt;/p&gt;


&lt;h2&gt;
  
  
  📸 Current state
&lt;/h2&gt;

&lt;p&gt;Here's how Courage has evolved:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day 42&lt;/th&gt;
&lt;th&gt;Day 57&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Text renders, basic colors&lt;/td&gt;
&lt;td&gt;Tabs, links, h1 large &amp;amp; bold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline CSS only&lt;/td&gt;
&lt;td&gt;External CSS fetched over network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No link clicking&lt;/td&gt;
&lt;td&gt;Click navigates, hover shows pointer cursor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No CSS variables&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;var()&lt;/code&gt; resolves recursively&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🔭 What's next: Attribute Selectors
&lt;/h2&gt;

&lt;p&gt;The next open issue is attribute selector matching — things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-color-mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"dark"&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="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;rel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"stylesheet"&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="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"text"&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub's entire dark theme is gated behind &lt;code&gt;[data-color-mode="dark"]&lt;/code&gt; on the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element. Once this lands, CSS variables on GitHub and Wikipedia will finally resolve to the right values.&lt;/p&gt;

&lt;p&gt;After that: image rendering. &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags currently just get skipped.&lt;/p&gt;




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

&lt;p&gt;Everything is open source:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/Nitin-kumar-yadav1307/Courage" rel="noopener noreferrer"&gt;github.com/Nitin-kumar-yadav1307/Courage&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I post updates here as milestones land. If you're curious about how browsers actually work — the TCP handshake, the tokenizer state machine, the CSS cascade, the layout algorithm — the code is readable and heavily iterative. No magic, no black boxes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Day 57. Still going.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>browser</category>
      <category>computerscience</category>
      <category>systems</category>
    </item>
    <item>
      <title>"I Built a Web Browser from Scratch in 42 Days — No Libraries, Just Node.js"</title>
      <dc:creator>Nitin Kumar Yadav</dc:creator>
      <pubDate>Sat, 04 Apr 2026 19:02:26 +0000</pubDate>
      <link>https://forem.com/nitinkumaryadav1307/i-built-a-web-browser-from-scratch-in-42-days-no-libraries-just-nodejs-416h</link>
      <guid>https://forem.com/nitinkumaryadav1307/i-built-a-web-browser-from-scratch-in-42-days-no-libraries-just-nodejs-416h</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Web Browser from Scratch in 42 Days
&lt;/h1&gt;

&lt;p&gt;42 days ago I made a decision.&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.amazonaws.com%2Fuploads%2Farticles%2Fwyop0fgkq8galy7rsc2y.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwyop0fgkq8galy7rsc2y.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted to understand how the internet actually works. Not just use it. Not just build on top of it. Actually understand it — at the wire level.&lt;/p&gt;

&lt;p&gt;So I started building a web browser from scratch. In Node.js. No external libraries. Every line written by hand.&lt;/p&gt;

&lt;p&gt;I called it Courage.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Courage can do today
&lt;/h2&gt;

&lt;p&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.amazonaws.com%2Fuploads%2Farticles%2F6m6v5klaqz1p3oi9ilsx.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6m6v5klaqz1p3oi9ilsx.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse URLs into protocol, host, port, path&lt;/li&gt;
&lt;li&gt;Open raw TCP and TLS connections&lt;/li&gt;
&lt;li&gt;Build and send HTTP GET requests&lt;/li&gt;
&lt;li&gt;Parse HTTP responses including chunked encoding&lt;/li&gt;
&lt;li&gt;Tokenize raw HTML character by character&lt;/li&gt;
&lt;li&gt;Build a DOM tree using a stack&lt;/li&gt;
&lt;li&gt;Match CSS rules to DOM nodes&lt;/li&gt;
&lt;li&gt;Calculate layout (x, y, width, height) for every element&lt;/li&gt;
&lt;li&gt;Paint rectangles and text on a Canvas using Electron&lt;/li&gt;
&lt;li&gt;Execute JavaScript via eval()&lt;/li&gt;
&lt;li&gt;Navigate with back, forward, reload&lt;/li&gt;
&lt;li&gt;Multiple tabs with independent history&lt;/li&gt;
&lt;li&gt;Render real websites — today it rendered Wikipedia&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Before this project I knew how to use the web. Now I understand it.&lt;/p&gt;

&lt;p&gt;TCP handshakes aren't magic. HTTP is just text. HTML is just tokens. CSS is just rules. A browser is just a pipeline.&lt;/p&gt;

&lt;p&gt;Every abstraction that used to feel like magic now makes complete sense.&lt;/p&gt;

&lt;p&gt;The most surprising thing — a layout engine is just two passes over a tree. Width flows down from parent to child. Height bubbles up from child to parent. That's it. That's what every browser does.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hard days
&lt;/h2&gt;

&lt;p&gt;Day 9 — built a DOM tree using a stack. Failed 6 times before it clicked.&lt;/p&gt;

&lt;p&gt;Day 21 — layout engine born. Took 3 days to get width and height right.&lt;/p&gt;

&lt;p&gt;Day 42 — fixed a bug where CSS inside style tags was breaking the entire DOM tree because my tokenizer treated &amp;gt; in CSS selectors as HTML tag endings.&lt;/p&gt;

&lt;p&gt;Every bug taught me something real.&lt;/p&gt;




&lt;h2&gt;
  
  
  The code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/Nitin-kumar-yadav1307/Courage" rel="noopener noreferrer"&gt;github.com/Nitin-kumar-yadav1307/Courage&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;42 days. No libraries. Every line by hand.&lt;/p&gt;

&lt;p&gt;This is just the beginning.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>programming</category>
      <category>beginners</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>BugVaulty — Auto-Track Every Error to Notion with AI Solutions 🐛</title>
      <dc:creator>Nitin Kumar Yadav</dc:creator>
      <pubDate>Sat, 28 Mar 2026 07:23:31 +0000</pubDate>
      <link>https://forem.com/nitinkumaryadav1307/bugvaulty-auto-track-every-error-to-notion-with-ai-solutions-am9</link>
      <guid>https://forem.com/nitinkumaryadav1307/bugvaulty-auto-track-every-error-to-notion-with-ai-solutions-am9</guid>
      <description>&lt;p&gt;🤖 &lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/notion-2026-03-04"&gt;Notion MCP Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;BugVaulty&lt;/strong&gt; is an npm package that automatically catches &lt;br&gt;
every error in your Node.js, Express, or React app — analyzes &lt;br&gt;
it with AI — and saves it to Notion automatically.&lt;/p&gt;

&lt;p&gt;No manual work. One line of code. Forever.&lt;/p&gt;

&lt;p&gt;In my early coding journey, I used to write down errors because it's one of the best ways to debug. If you already know how an error happened, it becomes easier to fix.&lt;/p&gt;

&lt;p&gt;Also, if you're working in a team, everyone can see the errors and help debug them, so you don't have to search the same error again and again on Google or AI.&lt;/p&gt;

&lt;p&gt;So I automated this process using Notion, MCP, and AI. Once you install and configure this package, all the errors from your terminal will automatically be tracked in your Notion.&lt;/p&gt;
&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error happens in your app
        ↓
BugVaulty catches it automatically
        ↓
AI analyzes it (Groq / OpenAI / Claude)
        ↓
Notion page created automatically with:
  📅 Date &amp;amp; Time
  📁 File path &amp;amp; line number  
  ❌ What went wrong
  💡 Step by step solution
  🔧 Code fix
  🚀 How to avoid it
  ⭐ Difficulty rating
  🏷️ Tags
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  One line setup:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;config&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;bugvaulty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bugvaulty&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;bugvaulty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// That's it! All errors now tracked to Notion automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Supports 3 AI providers:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Free option - Groq&lt;/span&gt;
&lt;span class="nx"&gt;bugvaulty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;groq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gsk_xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}})&lt;/span&gt;

&lt;span class="c1"&gt;// OpenAI&lt;/span&gt;
&lt;span class="nx"&gt;bugvaulty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;provider&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk-xxx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}})&lt;/span&gt;

&lt;span class="c1"&gt;// Anthropic Claude&lt;/span&gt;
&lt;span class="nx"&gt;bugvaulty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;claude&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sk-ant-xxx&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;
  
  
  Works with Express:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bugvaulty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expressMiddleware&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Works with React:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&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;BugVaultyProvider&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;bugvaulty/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;BugVaultyProvider&lt;/span&gt; &lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{...}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;BugVaultyProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  What Notion looks like after an error:
&lt;/h3&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.amazonaws.com%2Fuploads%2Farticles%2F1bv4r377hezahy5wx100.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bv4r377hezahy5wx100.png" alt="BugVaulty Notion Error Page" width="588" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every project gets its own page in Notion — detected automatically from your package.json name!&lt;/p&gt;
&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  Show us the code
&lt;/h2&gt;

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

&lt;p&gt;💻 &lt;a href="https://github.com/Nitin-kumar-yadav1307/bug-vaulty" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install it:&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;bugvaulty
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Used Notion MCP
&lt;/h2&gt;

&lt;p&gt;Notion MCP is the entire backbone of BugVaulty.&lt;/p&gt;

&lt;p&gt;Instead of building a custom database or dashboard, &lt;br&gt;
I used Notion as the storage and display layer via &lt;br&gt;
the Notion API and MCP.&lt;/p&gt;

&lt;p&gt;Here is what Notion MCP unlocks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Auto project organization&lt;/strong&gt;&lt;br&gt;
BugVaulty detects your project name from package.json &lt;br&gt;
and automatically creates a dedicated Notion page for &lt;br&gt;
that project. Every error goes under the right project &lt;br&gt;
automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Rich structured pages&lt;/strong&gt;&lt;br&gt;
Each error is saved as a beautifully structured Notion &lt;br&gt;
page with headings, bullet points, and code blocks — &lt;br&gt;
not just plain text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Searchable knowledge base&lt;/strong&gt;&lt;br&gt;
Because everything is in Notion, you can search your &lt;br&gt;
entire error history instantly. Next time you hit the &lt;br&gt;
same error — your own solution is already there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Zero infrastructure&lt;/strong&gt;&lt;br&gt;
No custom dashboard needed. No database to maintain. &lt;br&gt;
Notion IS the interface. This is what makes Notion MCP &lt;br&gt;
so powerful for developer tools.&lt;/p&gt;

&lt;p&gt;BugVaulty + Notion MCP = your personal AI debugging &lt;br&gt;
brain that never forgets. 🧠&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>notionchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>⚡ GitZip — Turning Git Commands into One-Word Spells with GitHub Copilot CLI</title>
      <dc:creator>Nitin Kumar Yadav</dc:creator>
      <pubDate>Tue, 10 Feb 2026 05:11:28 +0000</pubDate>
      <link>https://forem.com/nitinkumaryadav1307/gitzip-turning-git-commands-into-one-word-spells-with-github-copilot-cli-976</link>
      <guid>https://forem.com/nitinkumaryadav1307/gitzip-turning-git-commands-into-one-word-spells-with-github-copilot-cli-976</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;GitZip is a CLI productivity tool that turns long and hard-to-remember Git commands into short, reusable one-word "spells".&lt;/p&gt;

&lt;p&gt;Instead of repeatedly typing complex Git commands or copy-pasting them from Google or ChatGPT, developers can save a command once and reuse it instantly.&lt;/p&gt;

&lt;p&gt;For example, instead of running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reset --soft HEAD~1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can save it as a spell called &lt;code&gt;gundo&lt;/code&gt; and run it anytime with a single word.&lt;/p&gt;

&lt;p&gt;GitZip focuses on improving developer productivity, reducing mistakes, and making Git easier to use — especially for beginners.&lt;/p&gt;

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

&lt;p&gt;🎥 &lt;strong&gt;Demo Video:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://drive.google.com/file/d/1gLayfnghgSHl3z6Chc-XuTbF9KIL1_mk/view?usp=sharing" rel="noopener noreferrer"&gt;for demo video click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a Git command spell&lt;/li&gt;
&lt;li&gt;Running the spell inside a Git repository&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;gitzip demo&lt;/code&gt;, which automatically:

&lt;ul&gt;
&lt;li&gt;Initializes a Git repository&lt;/li&gt;
&lt;li&gt;Creates commits&lt;/li&gt;
&lt;li&gt;Creates a spell&lt;/li&gt;
&lt;li&gt;Undoes a commit&lt;/li&gt;
&lt;li&gt;Shows before/after Git logs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This makes it very easy for judges to test and understand the project.&lt;/p&gt;

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

&lt;p&gt;GitHub Copilot CLI played an important role in my development workflow.&lt;/p&gt;

&lt;p&gt;While building GitZip, I frequently used Copilot (CLI / Chat) to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask for correct Git commands&lt;/li&gt;
&lt;li&gt;Understand safer alternatives to risky Git operations&lt;/li&gt;
&lt;li&gt;Validate commands before saving them as reusable spells&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitZip is designed around this exact workflow:&lt;br&gt;
Ask GitHub Copilot for a Git command → Save it once → Reuse it forever.&lt;/p&gt;

&lt;p&gt;Instead of replacing Copilot, GitZip extends it by making Copilot's output reusable inside the terminal. This helped me build faster, avoid mistakes, and focus on designing a better user experience.&lt;/p&gt;




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

&lt;p&gt;🔗 GitHub Repository:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Nitin-kumar-yadav1307/GitZip" rel="noopener noreferrer"&gt;https://github.com/Nitin-kumar-yadav1307/GitZip&lt;/a&gt;&lt;/p&gt;




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