<?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: Khushiii </title>
    <description>The latest articles on DEV Community by Khushiii  (@khushimehappy).</description>
    <link>https://dev.to/khushimehappy</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%2F1325121%2Fd835bf71-8937-437a-b393-b816c7e1391a.jpg</url>
      <title>DEV Community: Khushiii </title>
      <link>https://dev.to/khushimehappy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khushimehappy"/>
    <language>en</language>
    <item>
      <title>A Perfect Desi Chai App 🍵 | React + Tailwind + A Monsoon Side Project (Part 01)🏝️</title>
      <dc:creator>Khushiii </dc:creator>
      <pubDate>Sun, 27 Jul 2025 17:45:25 +0000</pubDate>
      <link>https://dev.to/khushimehappy/a-perfect-desi-chai-app-react-tailwind-a-monsoon-side-project-part-01-3enk</link>
      <guid>https://dev.to/khushimehappy/a-perfect-desi-chai-app-react-tailwind-a-monsoon-side-project-part-01-3enk</guid>
      <description>&lt;p&gt;Errors, Anxiety, Code &amp;amp; My Not-So-Perfect Yet Honest Week-04🪻&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%2Fxtqmsgl884zgyofk09zq.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%2Fxtqmsgl884zgyofk09zq.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Jab jago tabhi savera" — When you wake up, it’s your morning.&lt;br&gt;
And that’s exactly how this week felt — late starts, chaos, doubts, but still showing up.☘️&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌼 My Week in One Line?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Errors, anxiety, fear, zero productivity... and me forcing myself to build something.&lt;br&gt;
Honestly, this week was so messy I don’t even know where to begin. 😮‍💨&lt;/p&gt;

&lt;p&gt;I had health issues, motivation issues, and major self-doubts.&lt;br&gt;
Was questioning myself, my resume, my skills, my existence as a dev — literally everything. And don’t even get me started on applying for jobs... that whole cycle has its own anxiety.&lt;/p&gt;

&lt;p&gt;But still — here I am. Posting my 6th blog of the month. Because I made a promise to myself : - &lt;/p&gt;

&lt;p&gt;✨ At least 1 blog every week in July — and I’m not breaking that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌼 My Mind Said "No", So I Said "Let’s Build"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I was trying to learn React properly this week — like actual lectures and tutorials.&lt;br&gt;
But it was sooo slow. I couldn’t sit through them without zoning out or feeling meh.&lt;br&gt;
And then I told myself : - &lt;/p&gt;

&lt;p&gt;"Khushi, chill. You don’t need to master it first — just try building something with it. Figure it out on the way."🌸&lt;/p&gt;

&lt;p&gt;So I picked a silly little project idea and gave it a heart — and that’s how &lt;code&gt;ChaiMate&lt;/code&gt; happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🪻Storytime First…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tadaaaa!🥁 Let’s go with a story.&lt;br&gt;
It’s rainy season in India. That vibe where everything smells like mitti and you just wanna curl up with CHAI.🍵&lt;br&gt;
(Yes, not "tea", we call it CHAI proudly.)&lt;/p&gt;

&lt;p&gt;So the idea hit me : - &lt;/p&gt;

&lt;p&gt;Why not build an app that helps you make &lt;strong&gt;the perfect desi chai&lt;/strong&gt; every single time?&lt;/p&gt;

&lt;p&gt;Like...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What ingredients to use 🍵&lt;/li&gt;
&lt;li&gt;How long to boil it ⏱&lt;/li&gt;
&lt;li&gt;Visuals for the vibe 👀&lt;/li&gt;
&lt;li&gt;AND of course… background music 🎶 (because vibes &amp;gt; everything)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🫶How I Started: Me, Chatty, and Chaos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I opened VS Code, asked Chatty (aka ChatGPT) for help with some basic structure, and started piecing things together.&lt;/p&gt;

&lt;p&gt;Before even touching Figma, I wrote a rough structure in VS Code —&lt;br&gt;
but yeah... forgot to take a screenshot 🥲 (why am I like this?)&lt;/p&gt;

&lt;p&gt;Then moved on to designing the actual UI in Figma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧱Stack I Used (And Fought With 😂)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React.js (first time using it in a real project)&lt;/li&gt;
&lt;li&gt;Tailwind CSS (which I ditched halfway 😭)&lt;/li&gt;
&lt;li&gt;Plain CSS (because Tailwind literally stopped working mid-code)&lt;/li&gt;
&lt;li&gt;Figma (for design)&lt;/li&gt;
&lt;li&gt;A lot of Chatty back-and-forth🧠&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tried hard with Tailwind... but errors kept coming, and I just wanted to see something work. So I said:&lt;/p&gt;

&lt;p&gt;“Nope. Switching to basic CSS for now.”&lt;/p&gt;

&lt;p&gt;My little blooper moment🥹 : - &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%2Fweb12y0but3hmut7gk9u.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%2Fweb12y0but3hmut7gk9u.png" alt=" " width="543" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Glimpses☘️&lt;/strong&gt;&lt;br&gt;
Here's my ICONSSSS🥨...&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%2Frk1m9om372ahpom176kx.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%2Frk1m9om372ahpom176kx.png" alt=" " width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🗂 Folder Structure : - &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%2F9y7ynye4zgup204o3elp.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%2F9y7ynye4zgup204o3elp.png" alt=" " width="186" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🏝️Figma Design : - &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%2Ftqcfd15n19tsggkybble.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%2Ftqcfd15n19tsggkybble.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚒️ Code Structure So Far&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%2F5bmh5n6f26ak5ottsfck.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%2F5bmh5n6f26ak5ottsfck.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💚GitHub Repo&lt;/strong&gt; : - &lt;br&gt;
I’m still figuring things out and tweaking a lot, but if you wanna peek or suggest anything : -&lt;br&gt;
&lt;a href="https://github.com/khushikumari239/A-Perfect-DESI-CHAI.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/A-Perfect-DESI-CHAI.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌼What Else I Was Juggling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updating my resume&lt;/li&gt;
&lt;li&gt;Feeling unsure about job applications&lt;/li&gt;
&lt;li&gt;Questioning my portfolio&lt;/li&gt;
&lt;li&gt;Getting stuck in overthinking mode&lt;/li&gt;
&lt;li&gt;But still... coding (even if slow)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🧡Resources I Used&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flaticon — for some cute icons (&lt;a href="https://www.flaticon.com/" rel="noopener noreferrer"&gt;https://www.flaticon.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Chatty (yes, again. The MVP 💅)&lt;/li&gt;
&lt;li&gt;Figma &amp;amp; VSCode — my two fav corners of chaos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🫶Ending the Week Like…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This wasn’t the most productive or aesthetic week.&lt;br&gt;
But it was real.&lt;/p&gt;

&lt;p&gt;I tried showing up even when I didn’t feel like it.&lt;br&gt;
I pushed through the boring, the anxious, the messy.&lt;br&gt;
And honestly? That counts. That really counts.&lt;/p&gt;

&lt;p&gt;If you're also in a slump, feeling stuck, lost, or doubting yourself -&lt;br&gt;
You're not alone. You're growing. 🌱&lt;/p&gt;

&lt;p&gt;Thanks for reading. And please please please — would love to hear your thoughts, feedback, or just say hi in the comments 🥹💬&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❤️Reminder : -&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is my 6th blog this month — yep, went beyond the original 4-blog challenge 🙌&lt;br&gt;
So here’s to more chai, more code, and more little stories from my developer journey☕🏝️🥨🪻🌸🕊️&lt;/p&gt;

&lt;p&gt;Catch you next week!💌&lt;br&gt;
Khushi🌸&lt;/p&gt;

&lt;p&gt;🪻MY Bento (Connect with me ) : - &lt;a href="https://bento.me/khushimehappy" rel="noopener noreferrer"&gt;https://bento.me/khushimehappy&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Learning MongoDB Like a Main Character 🍃🧑‍🚀</title>
      <dc:creator>Khushiii </dc:creator>
      <pubDate>Wed, 16 Jul 2025 13:27:35 +0000</pubDate>
      <link>https://dev.to/khushimehappy/learning-mongodb-like-a-main-character-5hjc</link>
      <guid>https://dev.to/khushimehappy/learning-mongodb-like-a-main-character-5hjc</guid>
      <description>&lt;p&gt;hellooooo everyone!!!&lt;br&gt;
I am back again with a journey update📹&lt;/p&gt;

&lt;p&gt;AND This girl’s learning by DOING❤️  &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%2F5emlrbvs42e6jvijdpr4.jpg" 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%2F5emlrbvs42e6jvijdpr4.jpg" alt=" " width="736" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am done with Express and now,&lt;br&gt;
I finally unlocked the M in MERN stack — MongoDBBBBBB☁️💚&lt;br&gt;
(or mangoDB for me because my brain loves fruits...😭)&lt;/p&gt;

&lt;p&gt;🌸And What I did...&lt;/p&gt;

&lt;p&gt;So the idea was simple in my head —&lt;br&gt;
I wanted to build a todo app&lt;br&gt;
but this time not storing things locally like arrays 😭&lt;br&gt;
this time with real database stuff like MongoDB (NoSQL)…&lt;/p&gt;

&lt;p&gt;Main concept was — users can &lt;code&gt;sign up&lt;/code&gt; and &lt;code&gt;log in&lt;/code&gt; with their info,&lt;br&gt;
and then their &lt;code&gt;todos&lt;/code&gt; will get &lt;code&gt;added/updated&lt;/code&gt; directly into the database (MongoDB cloud 🌥️).&lt;/p&gt;

&lt;p&gt;I used &lt;code&gt;JWTs&lt;/code&gt; &amp;amp; &lt;code&gt;tokens&lt;/code&gt; for authentication,&lt;br&gt;
&lt;code&gt;Postman&lt;/code&gt; for testing,&lt;br&gt;
&lt;code&gt;bcrypt + salt&lt;/code&gt; for password hashing (no plain text drama here 😤),&lt;br&gt;
&lt;code&gt;Zod&lt;/code&gt; for input validation,&lt;br&gt;
and of course handled all the random errors and bugs that came my way 🐛&lt;/p&gt;

&lt;p&gt;...anddd trust me, many more things I cried over but figured out eventually 😭✨&lt;/p&gt;

&lt;p&gt;And it was my first time doing all thisss...&lt;/p&gt;

&lt;p&gt;Like for real, I had zero clue in the beginning.🥹&lt;/p&gt;

&lt;p&gt;But here I am now —&lt;br&gt;
sharing my actual journey of how I built this MongoDB-powered Todo App💚&lt;/p&gt;

&lt;p&gt;I’ll be sharing all the resources, the mistakes, and the little “OMG IT’S WORKING” moments 😭&lt;/p&gt;

&lt;p&gt;And yes — after every single bug fix or code run,&lt;br&gt;
I was literally like:&lt;/p&gt;

&lt;p&gt;"IT’S WORKINGGGG!!!" (😭 screaming alone in my room lol)&lt;/p&gt;

&lt;p&gt;Also big win for me —&lt;br&gt;
I’m finally able to maintain a real coding streak and this time it feels so so real 🫶&lt;/p&gt;

&lt;p&gt;So here’s a little breakdown of everything I did,&lt;br&gt;
and if you’re a beginner — I promise, you can build this too 🫶&lt;/p&gt;

&lt;p&gt;🌸Also… here's the link to my GitHub repo if you wanna check it out or run with me → &lt;a href="https://github.com/khushikumari239/TODO-DB.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/TODO-DB.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌸Let’s build the backend skeleton first!&lt;/p&gt;

&lt;p&gt;So after setting up the project, I started creating the main backend structure —&lt;br&gt;
and trust me this was the part where things finally started to feel real-real🌼&lt;/p&gt;

&lt;p&gt;🛠️4 Core Routes I Created : -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /signup
POST /login
POST /todo (authenticated)
GET /todos (authenticated)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So after setting up MongoDB and Compass (yupp I did the full ritual 😭)...&lt;/p&gt;

&lt;p&gt;I created a file called &lt;code&gt;db.js&lt;/code&gt;where I wrote the schema for my app using Mongoose.&lt;/p&gt;

&lt;p&gt;Using two collections : - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;users&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;todos&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and my database looks something like this📸 &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%2F587y0sznftch6yafyotb.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%2F587y0sznftch6yafyotb.png" alt=" " width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌸Mongoose docs here : - &lt;a href="https://www.npmjs.com/package/mongoose" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/mongoose&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After setting up my schema in db.js,&lt;/p&gt;

&lt;p&gt;I imported the models inside index.js like this : - &lt;/p&gt;

&lt;p&gt;&lt;code&gt;const { UserModel, TodoModel } = require("./db");&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Now I could actually start doing the fun part — working with real data!&lt;/p&gt;

&lt;p&gt;Postman literally became my BFF during this whole process 😭&lt;br&gt;
I used it to : - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send user data for signup/login&lt;/li&gt;
&lt;li&gt;Test protected routes with tokens&lt;/li&gt;
&lt;li&gt;Create and fetch todos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 Here's a shot from the Postman chaos 👇 &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%2Fueaxymmc893ty3gkom5j.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%2Fueaxymmc893ty3gkom5j.png" alt=" " width="457" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;anddd every time I got a 200 OK response,&lt;br&gt;
I literally screamed “Yesss it’s workingggg” like 3 times 😭&lt;/p&gt;

&lt;p&gt;💀PLOT TWIST : - &lt;/p&gt;

&lt;p&gt;Imagine Paytm or BigBasket gets hacked…&lt;br&gt;
and they were storing passwords in plain text 😩&lt;/p&gt;

&lt;p&gt;Now my villain finds the leaked data —&lt;br&gt;
and sees: &lt;code&gt;"khushiiii@mail.com"&lt;/code&gt; → "&lt;code&gt;mainCharactervibes12"&lt;/code&gt; 😭&lt;/p&gt;

&lt;p&gt;And because I reused that password (don’t judge 🥲),&lt;br&gt;
they now have access to my Insta, Gmail… basically my whole digital life.&lt;/p&gt;

&lt;p&gt;Lesson learned : - no more plain passwords.&lt;br&gt;
We hash. We salt. We protect. 🔐&lt;/p&gt;

&lt;p&gt;🌸 A BLOG I Found (That Saved Me 😭)&lt;br&gt;
So while I was figuring out how to hash passwords properly,&lt;/p&gt;

&lt;p&gt;I came across this amazing blog : - &lt;br&gt;
👉 &lt;a href="https://heynode.com/blog/2020-04/salt-and-hash-passwords-bcrypt/" rel="noopener noreferrer"&gt;https://heynode.com/blog/2020-04/salt-and-hash-passwords-bcrypt/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It explains hashing, salting, and bcrypt so well —&lt;br&gt;
I swear if you’re also confused like I was, &lt;br&gt;
this will help you breathe again 😭💗&lt;/p&gt;

&lt;p&gt;Anddd ofc I went to the docs and read a bit like a serious dev 😤&lt;br&gt;
Look at these screenshots I took:&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%2Fb3jf80xu78zgltx3ncgw.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%2Fb3jf80xu78zgltx3ncgw.png" alt=" " width="612" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MongoDB Auto Update Moment 💚 : - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;And look at this!!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MongoDB auto-updated the stored password with the hashed version —&lt;br&gt;
no plain text, no drama ✨&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%2F1njb9ze3jl9e37tror9f.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%2F1njb9ze3jl9e37tror9f.png" alt=" " width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;😭 Silly Mistake I Made (Classic Dev Moment™)&lt;br&gt;
So at one point my DB was only showing the &lt;code&gt;email&lt;/code&gt;, not the &lt;code&gt;password.&lt;/code&gt;..&lt;/p&gt;

&lt;p&gt;And I was like : - &lt;br&gt;
"Wait... where's my hashed password???"&lt;/p&gt;

&lt;p&gt;Turns out — in my &lt;code&gt;db.js&lt;/code&gt; schema, I had written &lt;code&gt;Password&lt;/code&gt; (with a capital P) instead of &lt;code&gt;password&lt;/code&gt; (small p) 💀&lt;/p&gt;

&lt;p&gt;And MongoDB was like : girl, I don’t know what you’re trying to save, but okay??&lt;/p&gt;

&lt;p&gt;After fixing that — boom 💥&lt;br&gt;
Password saved correctly, hashes looking good, all chill 😌&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%2Fi7jiqhbfd36mmwokowot.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%2Fi7jiqhbfd36mmwokowot.png" alt=" " width="792" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally felt so relaxed after that fix… like yes, &lt;br&gt;
I’m still learning, but I’m figuring it out 🫶&lt;/p&gt;

&lt;p&gt;⚠️ Error Handling(aka: why is my server screaming!? 😭)&lt;br&gt;
Did some quick error handling using try–catch because my server was crashing when I used the same email twice 😩&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%2F7lerilrqygwetnjsfrnk.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%2F7lerilrqygwetnjsfrnk.png" alt=" " width="417" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it doesn’t cry every time I mess up 😭&lt;br&gt;
Doneeee. Finallyyyy. ✅&lt;/p&gt;

&lt;p&gt;-- My server's smart now 😤&lt;br&gt;
Thanks to Zod, it checks if your inputs are in the right format — or throws a tantrum 😌&lt;/p&gt;

&lt;p&gt;📦 Installed with: &lt;code&gt;npm install zod&lt;br&gt;
&lt;/code&gt; Docs: &lt;a href="https://zod.dev/" rel="noopener noreferrer"&gt;https://zod.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean. Safe. No random junk hitting my DB anymore ✅&lt;/p&gt;

&lt;p&gt;🧾Code? Yup, it’s all on GitHub! : - &lt;/p&gt;

&lt;p&gt;I built the whole logic from scratch —&lt;/p&gt;

&lt;p&gt;from defining schemas in db.js, to writing routes, hashing passwords, JWT auth, input validation... everything 🔥&lt;/p&gt;

&lt;p&gt;But instead of pasting pages of code here,&lt;/p&gt;

&lt;p&gt;check out my full GitHub repo 👉 (&lt;a href="https://github.com/khushikumari239/TODO-DB" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/TODO-DB&lt;/a&gt;)&lt;br&gt;
(it’s neater there, I promise 😭💗)&lt;/p&gt;

&lt;p&gt;Still, here’s a sneak peek 👀👇&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%2F17icvx4vlowxj8d6kqed.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%2F17icvx4vlowxj8d6kqed.png" alt=" " width="522" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💌 If You’re Coding Along…&lt;br&gt;
The code above is for anyone building this with me —&lt;br&gt;
copy, break it, fix it, vibe with it🌼&lt;/p&gt;

&lt;p&gt;Happy coding everyone! 💗&lt;/p&gt;

&lt;p&gt;What’s Next???💚&lt;br&gt;
This week’s packed...&lt;br&gt;
👾 I just started React (yes, the frontend glow-up begins!)&lt;br&gt;
👾 Planning a big project combining all the backend stuff I’ve learned&lt;br&gt;
👾 Also doing a code challenge I’ve been scared of for weeks…&lt;/p&gt;

&lt;p&gt;🌸 A Little Real Talk...&lt;br&gt;
There was a time I kept asking myself : - &lt;br&gt;
“Why would they choose me? What if I try and fail? Why even apply?”&lt;/p&gt;

&lt;p&gt;But then I was like...&lt;/p&gt;

&lt;p&gt;Wait Khushi — why NOT you??&lt;br&gt;
If I don’t try, how will I know what I’m capable of?&lt;/p&gt;

&lt;p&gt;So this time, I’m doing it.&lt;br&gt;
I’ll give it my honest best.&lt;br&gt;
If I win — yay. If I don’t — I’ll still learn a LOT.&lt;br&gt;
And that’s always a win, right?❤️&lt;/p&gt;

&lt;p&gt;I’ll share the whole journey of the challenge too —&lt;br&gt;
how I planned, wrote code, tackled bugs, everything!&lt;/p&gt;

&lt;p&gt;But for now…&lt;br&gt;
just know that I’m coding fearlessly this time 🫶&lt;br&gt;
and I’d love your support along the way 💌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mongodb</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building an Express App — My Fullstack Girly Era Unlocked (Part 01) 💅🏻🛠️</title>
      <dc:creator>Khushiii </dc:creator>
      <pubDate>Fri, 11 Jul 2025 08:56:07 +0000</pubDate>
      <link>https://dev.to/khushimehappy/jwt-tokens-and-an-express-app-my-fullstack-girly-era-unlocked-part-01-524p</link>
      <guid>https://dev.to/khushimehappy/jwt-tokens-and-an-express-app-my-fullstack-girly-era-unlocked-part-01-524p</guid>
      <description>&lt;p&gt;aka backend chaos, Postman errors, and drawing tokens with pens 😭✍️&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%2Fyxt673g32tv98jinya3s.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%2Fyxt673g32tv98jinya3s.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yess guys, I'm back with another weekly update (or a chaotic blog, same thing at this point).&lt;/p&gt;

&lt;p&gt;This week was all about Express.js, learning backend basics and unlocking new dev girl powers💪🫠.&lt;/p&gt;

&lt;p&gt;From setting up servers, hitting Postman with 403s, figuring out tokens, to finally meeting JWTs — &lt;br&gt;
it was FULL vibes and full chaos.🥹🫶&lt;/p&gt;

&lt;p&gt;So let's dive into building a basic Express app for authentication (and yeah, some hand-drawn madness included to explain my logic 😭).and googling google 🌸&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏁 Setting Up: Express Auth App Begins&lt;/strong&gt;&lt;br&gt;
Let’s initialise an Express app — super simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y                 # Step 1: Start Node project
touch index.js              # Step 2: Create entry file
npm install express         # Step 3: Add Express

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

&lt;/div&gt;



&lt;p&gt;Open it all in VS Code. IYKYK. 👩🏻‍💻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔐 Basic Auth — Signup &amp;amp; Signin&lt;/strong&gt;&lt;br&gt;
Let’s keep it minimal (but working):&lt;/p&gt;

&lt;p&gt;✅ POST /signup → save user info&lt;br&gt;
✅ POST /signin → validate + send token&lt;br&gt;
✅ Use express.json() middleware&lt;br&gt;
✅ Store users in an in-memory array (no DB rn, just memory lane 🧠)&lt;/p&gt;

&lt;p&gt;And here’s what my logic sketch looked like:&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%2F8kjht673njp941n0reps.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%2F8kjht673njp941n0reps.png" alt=" " width="728" height="973"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also here's how I planned storing tokens and user info 👇&lt;br&gt;
(I added JWT later, ignore that for now 😅)&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%2Ftk5k28d6p8uzfrk2io1j.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%2Ftk5k28d6p8uzfrk2io1j.png" alt=" " width="767" height="942"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯&lt;code&gt;/me&lt;/code&gt; Endpoint — Authenticated Route&lt;/strong&gt;&lt;br&gt;
So I created an endpoint called /me that returns user details only if they send a valid token.&lt;/p&gt;

&lt;p&gt;Because we love some privacy 😌&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%2Fpv1glfnvkfuyctr1swlp.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%2Fpv1glfnvkfuyctr1swlp.png" alt=" " width="590" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📫 Hitting It with Postman&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET&lt;/code&gt; for reading&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST&lt;/code&gt; for registering or logging in&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;http://localhost:3000/me&lt;/code&gt; to hit that private route&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How I ran it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Postman just waits for your requests like:&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%2F02cwaksb0pwhbswpxuic.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%2F02cwaksb0pwhbswpxuic.png" alt=" " width="800" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔓 Signup Flow&lt;/strong&gt;&lt;br&gt;
Start with &lt;code&gt;/signup&lt;/code&gt;&lt;br&gt;
(yes I made spelling errors at first... dev things 🙃)&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%2Fthskj5eysukm20jprwrm.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%2Fthskj5eysukm20jprwrm.png" alt=" " width="800" height="813"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then hit /signin to receive your token 🎟️&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%2Fkk1auduttvdk15idhtdi.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%2Fkk1auduttvdk15idhtdi.png" alt=" " width="800" height="985"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔑 Use the Token in Headers&lt;/strong&gt;&lt;br&gt;
After you receive the token, you gotta copy it and paste it in the headers when hitting &lt;code&gt;/me&lt;/code&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%2F6m7nzas9joea771q51cx.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%2F6m7nzas9joea771q51cx.png" alt=" " width="800" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ The token changes every time — it’s randomly generated by generateToken() in this version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧠 Auth in Action&lt;/strong&gt;&lt;br&gt;
Now when I hit /me using the valid token — boom, it works!&lt;br&gt;
Returns only my data 🔥&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%2Fgesk19bniq32995zx9ee.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%2Fgesk19bniq32995zx9ee.png" alt=" " width="800" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And yeah, GET method it is 👇&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%2F5r75kyg0yibypkjsaut1.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%2F5r75kyg0yibypkjsaut1.png" alt=" " width="800" height="115"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s what I get in my terminal too — actual user info 🔥&lt;/p&gt;

&lt;p&gt;Now unless someone steals my token (pls don’t 😭),&lt;br&gt;
they can’t access my &lt;code&gt;/me&lt;/code&gt; endpoint.&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%2F3ye8bcoeilb5fdzb5k9q.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%2F3ye8bcoeilb5fdzb5k9q.png" alt=" " width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🤔 Problem — But This Isn’t JWT Yet!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This whole setup uses a random token saved in memory.&lt;br&gt;
That means every time we validate, we must query the users array.&lt;/p&gt;

&lt;p&gt;Big no-no for real apps 😶‍🌫️&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%2Fcw6gymr8vyi5egyf9777.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%2Fcw6gymr8vyi5egyf9777.png" alt=" " width="396" height="81"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧃 Solution — Enter JWT (JSON Web Tokens)&lt;/strong&gt;&lt;br&gt;
JWT lets us sign and verify tokens — no need to store anything server-side.&lt;br&gt;
It carries its own data and verifies itself 🔐&lt;/p&gt;

&lt;p&gt;Here’s how I understood it (and drew it out 😅): - &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%2Fbwkmlz3eeqqj4rco6np9.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%2Fbwkmlz3eeqqj4rco6np9.png" alt=" " width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Some more doodles to make it clear 🖊️ ( I drew that🥹)&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%2F0l1ac105187crv26v44c.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%2F0l1ac105187crv26v44c.png" alt=" " width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔁 Replacing Token Logic with JWT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Install JWT&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&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%2Flb7a75a86lj8mdta89ju.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%2Flb7a75a86lj8mdta89ju.png" alt=" " width="768" height="221"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Remove generateToken()&lt;br&gt;
We don’t need it anymore.&lt;/p&gt;

&lt;p&gt;Step 3: Create a secret key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const JWT_SECRET = "USER_APP";

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

&lt;/div&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%2F7ibevnxuhw5dmygc17wz.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%2F7ibevnxuhw5dmygc17wz.png" alt=" " width="661" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Sign JWT&lt;br&gt;
When the user logs in, generate a JWT token like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const token = jwt.sign({ username: user.username }, JWT_SECRET);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F7dau4ggyvnaha16r5otc.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%2F7dau4ggyvnaha16r5otc.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧾 Bonus Sketch: Encryption vs Decryption&lt;br&gt;
I found this while figuring out how encryption works in JWT.&lt;br&gt;
Hope it helps someone 😅👇&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%2F5dwfdq232yqnyy6cqkv7.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%2F5dwfdq232yqnyy6cqkv7.png" alt=" " width="647" height="178"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔐 JWT Verification: The /me Endpoint&lt;/strong&gt;&lt;br&gt;
Once you’ve switched to JWTs, it’s time to verify them when users hit your protected route.&lt;/p&gt;

&lt;p&gt;Here’s how I did it in the &lt;code&gt;/me&lt;/code&gt;endpoint using &lt;code&gt;jwt.verify()&lt;/code&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%2F0to3djkkffq4kh8n0bxi.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%2F0to3djkkffq4kh8n0bxi.png" alt=" " width="721" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌻&lt;strong&gt;Running the Final Flow (With JWT Now!)&lt;/strong&gt;&lt;br&gt;
Now let’s see it in action from start to finish, this time with JWT-powered logic.&lt;/p&gt;

&lt;p&gt;📝 Step 1: Sign Up&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%2F53kw44dij6e489trrrcx.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%2F53kw44dij6e489trrrcx.png" alt=" " width="568" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔐 Step 2: Sign In (Get Your JWT Token)&lt;br&gt;
it’s long, has 3 parts separated by dots (.), and carries your data securely : - &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%2F2pvtizikb8dwhy82etb4.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%2F2pvtizikb8dwhy82etb4.png" alt=" " width="741" height="733"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧠 Step 3: Authenticated &lt;code&gt;/me&lt;/code&gt; Route&lt;br&gt;
Boom 💥 — you’re in!&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%2Fp5h6qbnexlgm6bj9xzj8.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%2Fp5h6qbnexlgm6bj9xzj8.png" alt=" " width="705" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This time it works without needing to check the DB — JWT handles the identity 🎟️.&lt;/p&gt;

&lt;p&gt;And here's how the terminal looks when all things align perfectly ✨&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%2Fifq4zjpf2fw84t60wzu0.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%2Fifq4zjpf2fw84t60wzu0.png" alt=" " width="621" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌸 Wrapping Up (for now...)&lt;br&gt;
This was one wild ride through backend basics, but here’s what we nailed:&lt;/p&gt;

&lt;p&gt;✅ Created a Node + Express app&lt;br&gt;
✅ Built basic auth logic with random tokens&lt;br&gt;
✅ Upgraded to secure JWT-based authentication&lt;br&gt;
✅ Tested it all via Postman&lt;br&gt;
✅ Cried once, debugged twice, and learned a LOT 😵‍💫🛠️&lt;/p&gt;

&lt;p&gt;🌸 MY github Repo : - [&lt;a href="https://github.com/khushikumari239/Express-APP.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/Express-APP.git&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;🚨 What’s Next?&lt;br&gt;
This was Part 01 of my backend chaos — stay tuned for:&lt;/p&gt;

&lt;p&gt;🖼️ Frontend integration&lt;br&gt;
🌿 Real-time form handling&lt;br&gt;
🍃 And starting MongoDB (finally unlocking the M in MERN 😭)&lt;/p&gt;

&lt;p&gt;Let me know if you vibed with this post (or if Postman scarred you too).&lt;br&gt;
Until then — more bugs, more doodles, and more dev girly energy 💅✨&lt;/p&gt;

&lt;p&gt;With 💻 &amp;amp; ☀️,&lt;br&gt;
Khushiii❤️&lt;/p&gt;

&lt;p&gt;raw and real. just me to you 🌼&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>backend</category>
    </item>
    <item>
      <title>Web Dev x AI x CLI: Just Me &amp; My Mini Project Vibes🫶🧩(Weekly updates)</title>
      <dc:creator>Khushiii </dc:creator>
      <pubDate>Sun, 06 Jul 2025 12:51:04 +0000</pubDate>
      <link>https://dev.to/khushimehappy/web-dev-x-ai-x-cli-just-me-my-mini-project-vibesweekly-updates-2n3e</link>
      <guid>https://dev.to/khushimehappy/web-dev-x-ai-x-cli-just-me-my-mini-project-vibesweekly-updates-2n3e</guid>
      <description>&lt;p&gt;Heyyy Techies👋&lt;/p&gt;

&lt;p&gt;It’s me, Khushi — A girl in tech who’s just out here learning, building, vibing, and making a little bit of chaos in the terminal 🌸💻.&lt;/p&gt;

&lt;p&gt;Sooo this week was so random but so fun — I did a little bit of everything : - &lt;br&gt;
Web Dev x Node.js x Express x HTTP servers x Gemini CLI x AI experiments — I was everywhere.&lt;/p&gt;

&lt;p&gt;And guess what? I LOVED it.&lt;br&gt;
That’s the vibe 🌸&lt;/p&gt;

&lt;p&gt;🌻 Weekly Sweet Highlights : - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Started with Node.js (because JavaScript is my comfort zone now ☕)&lt;/li&gt;
&lt;li&gt;Built HTTP servers from scratch 🚪&lt;/li&gt;
&lt;li&gt;Played around with Express.js, middlewares, CORS, and all that backend spice 🔧&lt;/li&gt;
&lt;li&gt;Connected Frontend to Backend (full-stack girly era unlocked 🛠️)&lt;/li&gt;
&lt;li&gt;Tried Google’s Gemini CLI (spoiler: it’s kinda cool ngl 🤖)&lt;/li&gt;
&lt;li&gt;Wrote some sweet lil blogs on the side 📝&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔮 Mini Project of the Week: Yane-AI&lt;br&gt;
Yane (屋根) means roof in Japanese — I picked this because just like a roof gives you a wide, cozy view from the top,&lt;br&gt;
Yane-AI helps you “see” what’s inside an image through AI-powered tagging.&lt;/p&gt;

&lt;p&gt;👉 Yane-AI GitHub Repo : - &lt;a href="https://github.com/khushikumari239/Yane-AI.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/Yane-AI.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s super simple : - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send an image URL 🖇️&lt;/li&gt;
&lt;li&gt;AI analyses it 🧠&lt;/li&gt;
&lt;li&gt;API sends back the tags 📦&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🌻Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts image URLs via POST API&lt;/li&gt;
&lt;li&gt;Uses Clarifai’s General Image Recognition model&lt;/li&gt;
&lt;li&gt;Returns a neat list of tags (concepts)&lt;/li&gt;
&lt;li&gt;Handles errors like a pro 👀&lt;/li&gt;
&lt;li&gt;Beginner-friendly and super clean to extend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clarifai site link : - &lt;a href="https://dev.tourl"&gt;clarifai.com/explore&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌻How to Run : -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/khushikumari239/Yane-AI.git
cd Yane-AI
npm install

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

&lt;/div&gt;



&lt;p&gt;Add your Clarifai API Key in a &lt;code&gt;.env&lt;/code&gt; file : -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLARIFAI_API_KEY=your_personal_access_token_here

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

&lt;/div&gt;



&lt;p&gt;Start the server : - &lt;br&gt;
&lt;code&gt;node index.js&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Your server is LIVE at : &lt;code&gt;http://localhost:3000&lt;/code&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%2F1nqiqwkiglx2mic3v57z.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%2F1nqiqwkiglx2mic3v57z.png" alt="Image description" width="627" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🛠️ API Quick Test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoint: &lt;code&gt;POST /analyze&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Request Body : -
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ "url": "https://samples.clarifai.com/metro-north.jpg" }

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

&lt;/div&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%2Facz86xx0la8oktx6oqfn.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%2Facz86xx0la8oktx6oqfn.png" alt="Image description" width="683" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response :-
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "tags": ["train", "railway", "transportation", "vehicle", "station", "city"]
}

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

&lt;/div&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%2Fun798dnxfdf2usxaod4j.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%2Fun798dnxfdf2usxaod4j.png" alt="Image description" width="293" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦 Other Cool Repos I Touched This Week:&lt;/strong&gt;&lt;br&gt;
🧵 CLI Tool + Gemini Playground : - &lt;a href="https://github.com/khushikumari239/CLI-Node.js.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/CLI-Node.js.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚡ Express App : - A basic Express.js app with signup and signin authentication (&lt;a href="https://github.com/khushikumari239/Express-APP.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/Express-APP.git&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;🧩 HTTP-Server : -Building my first HTTP server using Node.js — beginner-friendly and clean. (&lt;a href="https://github.com/khushikumari239/HTTP--SERVER.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/HTTP--SERVER.git&lt;/a&gt; )&lt;/p&gt;

&lt;p&gt;🌱 Wrapping Up My Tech Week : - &lt;/p&gt;

&lt;p&gt;This week was so me —&lt;br&gt;
A lil backend, a lil frontend, a lil AI, a lil blog — I’ve been everywhere and honestly? I loved every second.&lt;/p&gt;

&lt;p&gt;If you’re building too, or just vibing in your terminal —&lt;br&gt;
Slide into my GitHub 🌼 → &lt;a href="https://github.com/khushikumari239" rel="noopener noreferrer"&gt;https://github.com/khushikumari239&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or scream into the void with me on Twitter → &lt;a class="mentioned-user" href="https://dev.to/khushimehappy"&gt;@khushimehappy&lt;/a&gt; 🪐&lt;/p&gt;

&lt;p&gt;and LinkedIn -&amp;gt; &lt;a href="https://www.linkedin.com/in/khushimehappy/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/khushimehappy/&lt;/a&gt; (You can stalk my journey here 👀🫶)&lt;/p&gt;

&lt;p&gt;I’ll be back next week with more chaotic, messy, sweet lil mini projects. See ya! 💌&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Too Broke for Claude? Google’s Gemini CLI Got You.</title>
      <dc:creator>Khushiii </dc:creator>
      <pubDate>Sun, 06 Jul 2025 01:34:09 +0000</pubDate>
      <link>https://dev.to/khushimehappy/too-broke-for-claude-googles-gemini-cli-got-you-5hb5</link>
      <guid>https://dev.to/khushimehappy/too-broke-for-claude-googles-gemini-cli-got-you-5hb5</guid>
      <description>&lt;p&gt;It's been more than a Week Google finally dropped Gemini for the command line. &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%2F8is3xog8q751j4s4bavx.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%2F8is3xog8q751j4s4bavx.png" alt="Image description" width="467" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yep, now you can basically hand over the total control of your machine to AI. It can write code, create files, execute commands automatically, and pretty much do the stuff we programmers used to get paid for🥹.&lt;/p&gt;

&lt;p&gt;But let’s be honest… once again, Google is late to this party 🎉.&lt;/p&gt;

&lt;p&gt;Because guess what? We already have tools like Claude Code, OpenAI Codex, Warp, and a bunch of others absolutely dominating the CLI vibe.&lt;/p&gt;

&lt;p&gt;Butttt Gemini CLI hits different.&lt;br&gt;
And here’s why:&lt;br&gt;
🌼 It’s fully open-source.&lt;br&gt;
🌼 It’s FREE. Like, actually free with suuuper generous usage limits.&lt;/p&gt;

&lt;p&gt;We're talking thousands of free model requests per day to one of the most powerful coding models out there.&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%2Fudd1lyomurrzvfufftcl.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%2Fudd1lyomurrzvfufftcl.png" alt="Image description" width="800" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meanwhile, over at the Claude Pro Max Ultra Club, you’d probably need to cough up $200/month to generate the same amount of… well, slop in your terminal 😂.&lt;/p&gt;

&lt;p&gt;But hey, you get what you pay for, right?&lt;/p&gt;

&lt;p&gt;So, in today’s blog, I’m just going to vibe through Gemini CLI and see what’s up 🚀&lt;/p&gt;

&lt;p&gt;Claude Kinda Ruled, Till Now&lt;br&gt;
Right now, Claude Code is the vibe king when it comes to coding CLIs. They were the first major player to drop something like this, and since then, many others just tried to copy the vibe.&lt;/p&gt;

&lt;p&gt;But two things kinda kill it:&lt;br&gt;
🌼 It’s closed source 🥲&lt;br&gt;
🌼 It’s expensive as hell 💸&lt;/p&gt;

&lt;p&gt;If you’re like me and too broke to afford Claude, Google just became your bestie.&lt;/p&gt;

&lt;p&gt;Because Gemini gives you thousands of model requests per day… FOR FREE.&lt;br&gt;
Like whatttt? That’s kinda wild.&lt;/p&gt;

&lt;p&gt;And in today's Blog we will find out the gemini CLI....&lt;/p&gt;

&lt;p&gt;🔗Github Repo (Gemini CLI) :- &lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;https://github.com/google-gemini/gemini-cli&lt;/a&gt;&lt;br&gt;
🔗My Github Repo :- &lt;a href="https://github.com/khushikumari239/CLI-Node.js" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/CLI-Node.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Getting Started with Gemini CLI&lt;br&gt;
It’s super simple to install 👇&lt;br&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%2F4bgkrvdnvyu6yiw3pf2g.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%2F4bgkrvdnvyu6yiw3pf2g.png" alt="Image description" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;yess, just that easy. One line of code and you’re in.&lt;/p&gt;

&lt;p&gt;Here are some sweet screenshots I grabbed while playing around with it:- &lt;br&gt;
I tried to build a tic-tac-toe app using javaScript...&lt;/p&gt;

&lt;p&gt;I Built a Tic-Tac-Toe App 🎮&lt;br&gt;
Just to test the vibe, I asked Gemini to help me build a Tic-Tac-Toe app in JavaScript.&lt;/p&gt;

&lt;p&gt;Here's what I did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed Gemini CLI&lt;/li&gt;
&lt;li&gt;Ran gemini in my terminal&lt;/li&gt;
&lt;li&gt;Wrote the prompt for Tic-Tac-Toe&lt;/li&gt;
&lt;li&gt;It instantly started generating the code — BOOMMM 💥&lt;/li&gt;
&lt;li&gt;I ran it… and there was the magic ✨&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look at thisss:&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%2Fz4kvxah61ry5f9bl7x0v.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%2Fz4kvxah61ry5f9bl7x0v.png" alt="Image description" width="800" height="521"&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.amazonaws.com%2Fuploads%2Farticles%2Fa08nqu46hjnmsi9587a4.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%2Fa08nqu46hjnmsi9587a4.png" alt="Image description" width="677" height="285"&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.amazonaws.com%2Fuploads%2Farticles%2F4u5gohpypp4i0t68b6o1.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%2F4u5gohpypp4i0t68b6o1.png" alt="Image description" width="661" height="150"&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.amazonaws.com%2Fuploads%2Farticles%2F6wtmasyvdb39rpcpzfo1.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%2F6wtmasyvdb39rpcpzfo1.png" alt="Image description" width="800" height="496"&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.amazonaws.com%2Fuploads%2Farticles%2Fl609kwen8pgdh6xo1nsm.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%2Fl609kwen8pgdh6xo1nsm.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Final Thoughts 🌸&lt;br&gt;
Okay, so is it perfect? No.&lt;br&gt;
But it’s actually super fun to use. Gemini CLI is still growing, but the fact that it’s open-source and free makes me wanna explore it more.&lt;/p&gt;

&lt;p&gt;If you love CLI tools, wanna vibe with coding buddies, or you’re just too broke for premium AI subscriptions (like me 😅) — give Gemini CLI a try.&lt;/p&gt;

&lt;p&gt;Have you vibed with Gemini CLI yet?&lt;br&gt;
Let me know in the comments or come scream into the void with me on Twitter [&lt;a class="mentioned-user" href="https://dev.to/khushimehappy"&gt;@khushimehappy&lt;/a&gt;] — I’m always down to geek out 😆🚀&lt;/p&gt;

</description>
      <category>gemini</category>
      <category>ai</category>
      <category>opensource</category>
      <category>cli</category>
    </item>
    <item>
      <title>Building My First CLI Tool — Messy but Worth It!</title>
      <dc:creator>Khushiii </dc:creator>
      <pubDate>Thu, 03 Jul 2025 13:40:21 +0000</pubDate>
      <link>https://dev.to/khushimehappy/building-my-first-cli-tool-messy-but-worth-it-26f0</link>
      <guid>https://dev.to/khushimehappy/building-my-first-cli-tool-messy-but-worth-it-26f0</guid>
      <description>&lt;p&gt;It wasn’t perfect, but I built it — and that’s the vibe🌼&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%2Foepxu45vxd20n10dhm2x.jpg" 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%2Foepxu45vxd20n10dhm2x.jpg" alt="Image description" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hellooo Devs👋&lt;br&gt;
It’s me, Khushi — A curious kid just figuring things out 🌸&lt;/p&gt;

&lt;p&gt;This is not some expert tutorial.&lt;br&gt;
This is just a lil story about how I learned to build a CLI (Command Line Interface) tool — in my own messy, random way 😭✨&lt;/p&gt;

&lt;p&gt;🌼Where I Started&lt;br&gt;
I just started with the basics — JavaScript vibes only.&lt;br&gt;
Learning how to play with strings, arrays, and the console.&lt;/p&gt;

&lt;p&gt;This gave me the lil push to actually try something on my own.&lt;/p&gt;

&lt;p&gt;💭My First Thought:&lt;br&gt;
What if I build a CLI that counts how many lines are there in my .txt file?&lt;/p&gt;

&lt;p&gt;Sounds simple right? Let’s gooo.&lt;/p&gt;

&lt;p&gt;For this, I used the Commander library 👉&lt;a href="https://www.npmjs.com/package/commander?activeTab=readme" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/commander?activeTab=readme&lt;/a&gt;&lt;br&gt;
It helped me create and print commands easily.&lt;/p&gt;

&lt;p&gt;Here’s what it looked like 👇&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%2Fv6m71k7v8qbzobklisng.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%2Fv6m71k7v8qbzobklisng.png" alt="Image description" width="800" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The code👀: - &lt;br&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%2F29dbie10cz4v0ln5j8mw.jpg" 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%2F29dbie10cz4v0ln5j8mw.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✨ Level Up: Gimme Some Colors!&lt;br&gt;
After this lil project, I thought — let’s build something cuter and more interactive.&lt;/p&gt;

&lt;p&gt;So I built a CLI that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shows a fancy welcome banner using figlet (&lt;a href="https://www.npmjs.com/package/figlet" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/figlet&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Prompts the user’s name using inquirer (&lt;a href="https://www.npmjs.com/package/inquirer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/inquirer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Greets them back with colorful text using gradient-string (&lt;a href="https://www.npmjs.com/package/gradient-string?activeTab=readme" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/gradient-string?activeTab=readme&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Basically, a whole vibe.&lt;/p&gt;

&lt;p&gt;Outcome👀: - &lt;br&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%2F8v552vhq7f5uc7ztk35z.jpg" 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%2F8v552vhq7f5uc7ztk35z.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚧 The Problem I Faced (Yup, Struggled)&lt;br&gt;
Okay, this one actually got me 😵‍💫&lt;/p&gt;

&lt;p&gt;I had issues with type: module in package.json.&lt;br&gt;
At first, my CLI wasn’t working because I was mixing Node.js modules and ES modules 💀&lt;/p&gt;

&lt;p&gt;So I had to figure it out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Use .cjs instead of .js (yeah that works!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OR update package.json to support both module types.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here’s a lil screenshot of that chaos:&lt;br&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%2F93jh210d2aev83q4fy9z.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%2F93jh210d2aev83q4fy9z.png" alt="Image description" width="435" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I saw that I can actually make my terminal look cute with colors and banners, I was sold 😂✨&lt;/p&gt;

&lt;p&gt;🔗GitHub Repo link : - &lt;a href="https://github.com/khushikumari239/CLI-Node.js.git" rel="noopener noreferrer"&gt;https://github.com/khushikumari239/CLI-Node.js.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚙️What I Built (the basic starter pack)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Showed a cool banner&lt;/li&gt;
&lt;li&gt;Asked the user their name&lt;/li&gt;
&lt;li&gt;Greeted them back with colorful text (obviously)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All this — in the terminal.&lt;br&gt;
Running it in Node.js was actually not that scary once I broke it down into small lil steps.&lt;/p&gt;

&lt;p&gt;Also had to figure out promises, callbacks, and async code (not gonna lie, it fried my brain a bit but we survived 🫠)&lt;/p&gt;

&lt;p&gt;🌸What I Learned (aka life lessons lol)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Breaking stuff into tiny steps is literally the hack&lt;/li&gt;
&lt;li&gt;Using ready-made libraries is NOT cheating — it’s smart&lt;/li&gt;
&lt;li&gt;You learn the most by just TRYING and tweaking random stuff&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’ve been thinking about building a CLI — just do it. Start small, keep it fun, don’t overthink.&lt;br&gt;
Trust me, you’ll vibe.&lt;/p&gt;

&lt;p&gt;So yeah — figuring this out was a whole mission but I did it 🤌&lt;/p&gt;

&lt;p&gt;💌 Let’s Talk!&lt;br&gt;
That’s my messy lil CLI story, straight from me to you 🤍&lt;br&gt;
Not perfect, but definitely worth it.&lt;/p&gt;

&lt;p&gt;Are you building something? Tell me in the comments!!&lt;br&gt;
I wanna see your journey too — let’s build, fail, laugh, and vibe together 🫶&lt;br&gt;
Big thanks to GeeksforGeeks (GFG)💚&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>node</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
