<?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: Rohan Mirjankar </title>
    <description>The latest articles on DEV Community by Rohan Mirjankar  (@rohan_mirjankar).</description>
    <link>https://dev.to/rohan_mirjankar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3797131%2F7bd370c9-d915-4bc7-9285-cab977e92499.png</url>
      <title>DEV Community: Rohan Mirjankar </title>
      <link>https://dev.to/rohan_mirjankar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rohan_mirjankar"/>
    <language>en</language>
    <item>
      <title>Building GitHub Authentication: From GitHub App Setup to OAuth Callback</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Sun, 25 Oct 2026 13:12:48 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/building-github-authentication-from-github-app-setup-to-oauth-callback-572a</link>
      <guid>https://dev.to/rohan_mirjankar/building-github-authentication-from-github-app-setup-to-oauth-callback-572a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapmcwuzz7qouwqmwgs8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapmcwuzz7qouwqmwgs8s.png" alt="Intro" width="602" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ever wondered what actually happens when you click &lt;strong&gt;"Continue with GitHub"&lt;/strong&gt; on a website?&lt;/p&gt;

&lt;p&gt;For JSCrafts, I needed a way to identify users through their GitHub accounts and connect that identity to my application's user database.&lt;/p&gt;

&lt;p&gt;I decided to use a GitHub App and implement the authorization flow in Next.js. In this article, I'll walk through the setup, environment variables, authorization redirect, callback handling, and how I connect the authenticated GitHub profile to my database.&lt;/p&gt;

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

&lt;p&gt;Let's break it down step by step.&lt;/p&gt;

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

&lt;p&gt;A GitHub App is like a formal partnership agreement between your application and GitHub users.&lt;/p&gt;

&lt;p&gt;Imagine building a passport automation system where you need to authenticate new users. Forget the technical jargon for a moment. Think of it this way: just as a Social Security Number (SSN) can help uniquely identify an individual, GitHub authentication allows your app to identify and verify users through their GitHub accounts.&lt;/p&gt;

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

&lt;p&gt;GitHub offers several ways to authenticate users and access its resources, including Personal Access Tokens, OAuth Apps, and GitHub Apps. Each serves a different purpose, but I needed an approach that would support user authentication while allowing my application to request specific permissions for GitHub resources.&lt;/p&gt;

&lt;p&gt;I chose a &lt;strong&gt;GitHub App&lt;/strong&gt; because it offers granular permissions and supports acting both as an application and on behalf of authorized users. This made it a suitable fit for my application's authentication and integration requirements.&lt;/p&gt;

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

&lt;p&gt;I started by navigating to:&lt;/p&gt;

&lt;p&gt;GitHub → Settings → Developer settings → GitHub Apps → New GitHub App&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;GitHub Apps are registered through the Developer settings section of a GitHub account or organization.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Configured the basic details: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Tha callback URL:&lt;br&gt;&lt;br&gt;
The callback URL is the address GitHub sends the user back to after they approve (or deny) login on GitHub's site.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Where do you want the user to be sent after github app does its job?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I registered every URL I will be using&lt;br&gt;
Development: &lt;a href="http://localhost:3000/api/auth/github/callback" rel="noopener noreferrer"&gt;http://localhost:3000/api/auth/github/callback&lt;/a&gt;&lt;br&gt;
Production: &lt;a href="https://jscrafts.vercel.app/api/auth/github/callback" rel="noopener noreferrer"&gt;https://jscrafts.vercel.app/api/auth/github/callback&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Permissions&lt;br&gt;&lt;br&gt;
Permissions determine what a GitHub App can access or modify. Granting excessive permissions increases the potential impact of a compromised application.&lt;/p&gt;

&lt;p&gt;For the initial setup, I kept repository access read-only and limited the permissions to the requirements of the integration.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Webhooks&lt;br&gt;&lt;br&gt;
GitHub webhooks allow an application to receive event notifications, such as repository-related changes, without continuously polling the API.&lt;/p&gt;

&lt;p&gt;I planned to use a webhook endpoint for future repository integration, but the endpoint had not yet been implemented.&lt;/p&gt;

&lt;p&gt;Therefore, I deferred webhook configuration until the application had a working endpoint. When webhooks are enabled, the webhook URL and secret must be configured appropriately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating the .env.local File&lt;br&gt;
I added the following environment variable names:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    GITHUB_CLIENT_ID=
    GITHUB_CLIENT_SECRET=
    GITHUB_APP_ID= 
    GITHUB_PRIVATE_KEY=
    GITHUB_WEBHOOK_SECRET=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Usecase&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GITHUB_CLIENT_ID&lt;/td&gt;
&lt;td&gt;A public identifier for the github app. Like a username.&lt;/td&gt;
&lt;td&gt;It appears in the URL when redirecting users to GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GITHUB_CLIENT_SECRET&lt;/td&gt;
&lt;td&gt;A secret password for the app. Like a password paired with the client ID.&lt;/td&gt;
&lt;td&gt;Exchanging the authorization code for an access token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GITHUB_APP_ID&lt;/td&gt;
&lt;td&gt;A numeric ID for the GitHub App itself&lt;/td&gt;
&lt;td&gt;When your application wants to read repositories on its own behalf.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GITHUB_PRIVATE_KEY&lt;/td&gt;
&lt;td&gt;A cryptographic key (.pem file) that proves "I really am the GitHub App."&lt;/td&gt;
&lt;td&gt;Generating JWTs to authenticate as the GitHub App itself, used later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GITHUB_WEBHOOK_SECRET&lt;/td&gt;
&lt;td&gt;A shared password used to verify that incoming webhook requests actually came from GitHub.&lt;/td&gt;
&lt;td&gt;The eventual /api/github/webhook route&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ya6r8noleuzmz9evdt3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ya6r8noleuzmz9evdt3.png" alt="Section 4" width="713" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before implementing, understand the actors in our implementation.&lt;br&gt;&lt;br&gt;
The browser is the user, your app server, GitHub's website and GitHub's API.&lt;br&gt;&lt;br&gt;
We need two separate routes to complete the entire flow.  &lt;/p&gt;
&lt;h3&gt;
  
  
  Route 1: Send the user to GitHub.
&lt;/h3&gt;

&lt;p&gt;The URL looks 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;    https://github.com/login/oauth/authorize
    ?client_id=[GITHUB-CLIENT_ID]
    &amp;amp;redirect_uri=[CALLBACK_URL]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file you need create is &lt;code&gt;src/app/api/auth/github/route.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Read the client ID from env&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GITHUB_CLIENT_ID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GitHub client ID is not configured&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Figure out which callback URL to use&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redirectUri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://jscrafts.vercel.app/api/auth/github/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000/api/auth/github/callback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Build the GitHub URL&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;githubUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://github.com/login/oauth/authorize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;githubUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;githubUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;redirect_uri&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;redirectUri&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Send the browser there&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;githubUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the browser lands on that URL, github checks the client_id and responds to the real Github App.&lt;br&gt;&lt;br&gt;
If they approve --&amp;gt; redirect to the callback url along with &lt;code&gt;?code=ABC123&lt;/code&gt;&lt;br&gt;&lt;br&gt;
If they deny --&amp;gt; redirects back with &lt;code&gt;?error=access_denied&lt;/code&gt;&lt;br&gt;&lt;br&gt;
The code that it sends back when approved is important, its short-lived, single-use and is used with CLIENT_ID for fetching github user details for initial profile building.  &lt;/p&gt;
&lt;h3&gt;
  
  
  Route 2: Receive the user back from GitHub
&lt;/h3&gt;

&lt;p&gt;The file you need to &lt;code&gt;src/app/api/auth/github/callback/route.ts&lt;/code&gt;&lt;br&gt;&lt;br&gt;
This is the meat of the login. It does four things in order:  &lt;/p&gt;
&lt;h4&gt;
  
  
  Part 1: Read the code or error
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextRequest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nextUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&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;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/?error=github_denied&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/?error=missing_code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ... continue&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Part 2: Exchange code for access token
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tokenResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://github.com/login/oauth/access_token&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;client_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;client_secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;redirect_uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;redirectUri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tokenData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tokenResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;tokenResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;tokenData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;NextResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/?error=github_token_exchange&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Part 3: Fetch the user's profile
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;githubUserResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.github.com/user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tokenData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/vnd.github+json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;githubUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;githubUserResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;GitHub returns something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12345678&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rohan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rohan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"avatar_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://avatars.githubusercontent.com/u/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"html_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/rohan"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Part 4: Create the JSCrafts user
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;connectDB&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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOneAndUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;githubId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;githubId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;displayName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;avatarUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;avatar_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;profileUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;primaryEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// return the updated document&lt;/span&gt;
    &lt;span class="na"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// create it if it doesn't exist&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What &lt;code&gt;findOneAndUpdate&lt;/code&gt; with &lt;code&gt;upsert: true&lt;/code&gt; does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Look for a User with githubId = "12345678"
2. If found → update its fields, return it
3. If not found → create a new User with all these fields, return it
This is the classic "find-or-create" pattern. It handles both first-time and returning users in a single query.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Why use githubId as the key?&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It's stable — usernames can change, IDs can't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It's unique — each GitHub account has exactly one ID.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why &lt;code&gt;new: true&lt;/code&gt; ?&lt;br&gt;&lt;br&gt;
    Without it, MongoDB returns the old document (before the update). With it, you get the new one, which is what you want for the session step.&lt;/p&gt;




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

&lt;p&gt;Building GitHub authentication for JSCrafts helped me understand three important things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Permission scoping matters:&lt;/strong&gt; Request only the access your application actually needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OAuth security matters:&lt;/strong&gt; State validation, secure credential handling, and proper error handling are essential parts of the flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication has multiple layers:&lt;/strong&gt; Authenticating a user through GitHub is different from authenticating the GitHub App itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an important step in building JSCrafts. The next step is to ensure that the authorization flow is backed by secure session management and that every protected route checks the user's session.&lt;/p&gt;

</description>
      <category>github</category>
      <category>authentication</category>
      <category>api</category>
      <category>oauth</category>
    </item>
    <item>
      <title>Stop Shipping Broken Env Configs — I Built a Fix</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Fri, 08 May 2026 14:26:51 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/stop-shipping-broken-env-configs-i-built-a-fix-3eoc</link>
      <guid>https://dev.to/rohan_mirjankar/stop-shipping-broken-env-configs-i-built-a-fix-3eoc</guid>
      <description>&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%2Frvtnkrv8xuyoyu8fwdtj.png" class="article-body-image-wrapper"&gt;&lt;img height="963" 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%2Frvtnkrv8xuyoyu8fwdtj.png" width="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've all been there. You push to production, the server crashes, and after 20 minutes of debugging you realize &lt;code&gt;DATABASE_URL&lt;/code&gt; was never set. Or you've got a &lt;code&gt;.env&lt;/code&gt; file with 30 variables and no idea which ones your app actually uses anymore.&lt;/p&gt;

&lt;p&gt;I got tired of it, so I built &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@rohansm14/envguard" rel="noopener noreferrer"&gt;envguard&lt;/a&gt;&lt;/strong&gt; — a zero-dependency environment variable validator and codebase analyzer for Node.js.&lt;/p&gt;




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

&lt;p&gt;envguard has three main jobs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Validate &amp;amp; coerce at startup&lt;/strong&gt; — define a schema, and envguard throws a single combined error listing &lt;em&gt;all&lt;/em&gt; broken variables before your server even boots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Analyze your codebase&lt;/strong&gt; — scan your entire project to find variables that are defined in &lt;code&gt;.env&lt;/code&gt; but never used in code (dead weight), and variables used in code but missing from &lt;code&gt;.env&lt;/code&gt; (silent bugs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Dev Dashboard&lt;/strong&gt; — a local UI that visualizes your env health in real-time, including type mismatches against an optional schema file.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The architecture is pretty straightforward — three core modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;guard.js&lt;/code&gt;&lt;/strong&gt; — validates env vars against a schema at runtime, coercing types (&lt;code&gt;"3000"&lt;/code&gt; → &lt;code&gt;3000&lt;/code&gt;, &lt;code&gt;"true"&lt;/code&gt; → &lt;code&gt;true&lt;/code&gt;) and throwing one combined error if anything's wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;scanner.js&lt;/code&gt;&lt;/strong&gt; — recursively walks your project files using three regex patterns to catch every usage style: dot notation (&lt;code&gt;process.env.VAR&lt;/code&gt;), bracket notation (&lt;code&gt;process.env['VAR']&lt;/code&gt;), and destructuring (&lt;code&gt;const { VAR } = process.env&lt;/code&gt;). It also strips comments first so you don't get false positives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;server.js&lt;/code&gt;&lt;/strong&gt; — a lightweight Node &lt;code&gt;http&lt;/code&gt; server that runs the scanner on every poll and serves the dashboard UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No dependencies. Just native Node.js all the way down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Usage
&lt;/h2&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; @rohansm14/envguard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If anything's wrong, you get one clear error at boot — not a mystery crash at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI scan:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx envguard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prints a report of unused and missing variables across your whole codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev dashboard:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx envguard dev-ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opens &lt;code&gt;http://localhost:3000&lt;/code&gt; with live polling, type mismatch detection, and status badges for every variable.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Regex is trickier than it looks.&lt;/strong&gt; Handling all three usage patterns (dot, bracket, destructuring) while also stripping comments to avoid false positives took a few iterations. The destructuring regex in particular — parsing aliases like &lt;code&gt;const { DB_URL: db } = process.env&lt;/code&gt; — was the most fiddly part.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proxies are powerful but need careful handling.&lt;/strong&gt; The &lt;code&gt;guard()&lt;/code&gt; result is a ES6 Proxy that throws on access to undefined validated keys. Getting that to play nicely with things like &lt;code&gt;toJSON&lt;/code&gt;, &lt;code&gt;then&lt;/code&gt;, and &lt;code&gt;Symbol&lt;/code&gt; properties (which Node and various frameworks probe for) required a bunch of edge case handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One combined error &amp;gt; many errors.&lt;/strong&gt; Throwing all validation failures at once instead of stopping at the first one was a deliberate DX choice — and honestly the thing I'm happiest about. Nothing's worse than fixing one env error, restarting, and hitting another.&lt;/p&gt;




&lt;p&gt;The code is open source on &lt;a href="https://github.com/Rohan-Shridhar/envguard" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. If you've ever lost time to a broken env config, give it a try — would love feedback!&lt;/p&gt;

</description>
      <category>npm</category>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🌍 I Built an Interactive Climate Simulator Where You Control Earth's Fate</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Sun, 19 Apr 2026 12:59:34 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/i-built-an-interactive-climate-simulator-where-you-control-earths-fate-2h8n</link>
      <guid>https://dev.to/rohan_mirjankar/i-built-an-interactive-climate-simulator-where-you-control-earths-fate-2h8n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/weekend-2026-04-16"&gt;Weekend Challenge: Earth Day Edition 🌍&lt;/a&gt;&lt;/em&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%2Fyfacc7b12vm2taq2d6ue.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%2Fyfacc7b12vm2taq2d6ue.png" alt="earth" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;I built the &lt;strong&gt;Earth Condition Simulator&lt;/strong&gt; — an interactive, browser-based climate model that puts the fate of our planet directly in your hands.&lt;/p&gt;

&lt;p&gt;You control six critical environmental parameters — &lt;strong&gt;Temperature, Sea Level, Forest Cover, Pollution, Ice Caps, and Clean Energy&lt;/strong&gt; — and watch Earth respond in real time. The globe visually reacts to every change: ice caps melt, toxic smog rolls in, forests burn, and oceans turn murky. And yes — Earth has &lt;em&gt;feelings&lt;/em&gt; about it.&lt;/p&gt;

&lt;p&gt;The core idea was to make climate data &lt;em&gt;feel&lt;/em&gt; visceral rather than abstract. Instead of graphs and tables, you get a living, breathing, &lt;strong&gt;emoting&lt;/strong&gt; globe that literally makes a face when things go wrong.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;a href="https://rohan-shridhar.github.io/earth" rel="noopener noreferrer"&gt;Live Demo → rohan-shridhar.github.io/earth&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Rohan-Shridhar" rel="noopener noreferrer"&gt;
        Rohan-Shridhar
      &lt;/a&gt; / &lt;a href="https://github.com/Rohan-Shridhar/earth" rel="noopener noreferrer"&gt;
        earth
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Earth Condition Simulator
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌍 Earth Condition Simulator&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An interactive, high-fidelity browser-based simulator that puts the fate of our planet in your hands. Adjust environmental factors in real-time and witness the immediate visual and biological consequences on a global scale.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 What I Built&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;I built an interactive climate model and survival simulator. Users control six critical environmental sliders—&lt;strong&gt;Temperature, Sea Level, Forest Cover, Pollution, Ice Caps, and Clean Energy&lt;/strong&gt;—to observe their real-time impact on Earth's vitality.&lt;/p&gt;
&lt;p&gt;The project features a custom-rendered SVG globe that reacts visually to your settings (melting ice caps, toxic oceans, spreading smog) and includes a professional-grade simulation engine that projects human population changes over a 10-year period based on your ecological choices.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🔗 Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://rohan-shridhar.github.io/earth/" rel="nofollow noopener noreferrer"&gt;Live Demo →&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Animated SVG Earth&lt;/strong&gt;: A custom-built globe with organic bezier-path continents and real-time visual updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6-Axis Environmental Control&lt;/strong&gt;: Fine-tuned sliders for a wide range of climate scenarios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Rohan-Shridhar/earth" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Features at a Glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌍 Animated SVG Globe&lt;/strong&gt; — Custom-built with organic Bezier-path continents, real-time ocean color shifting, smog overlays, fire particles, cloud layers, and polar ice caps — all reacting live to your slider input&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;😊 Earth's Emotional Face&lt;/strong&gt; — The globe has animated eyes, eyebrows, cheeks, and a mouth that morph across 5 emotional states as Earth Health changes — from rosy-cheeked happiness to X-eyes and a wobbling distressed mouth at near-extinction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🌕 Orbiting Moon with Personality&lt;/strong&gt; — A textured SVG moon orbits the globe in a proper elliptical path, correctly rendering behind Earth on the far side and in front on the near side. The Moon has its own reactive face — it gets increasingly worried with sweat drops as Earth's condition worsens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎉 Earth Day Banner&lt;/strong&gt; — A vertical side panel with a drop-bounce letter reveal animation and SVG confetti explosion (click to trigger again!) celebrating April 22&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 Environmental Sliders&lt;/strong&gt; — Temperature (−2°C to +10°C), Sea Level, Forest Cover, Pollution, Ice Caps, and Clean Energy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Earth Health Score&lt;/strong&gt; — A unified 0–1000 vitality meter with reactive color-coded status labels (from &lt;em&gt;Thriving Paradise&lt;/em&gt; to &lt;em&gt;Near Extinction&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Population Ticker&lt;/strong&gt; — A frame-by-frame world population counter (8.2B baseline) that ticks up or down based on current planetary health&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Feed&lt;/strong&gt; — Contextual alerts that surface climate events based on your settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10-Year Simulation Engine&lt;/strong&gt; — Year-by-year population projection with animated reveal and color-coded survival verdict&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Dependencies&lt;/strong&gt; — Pure Vanilla HTML5, CSS3, and JS. No frameworks, no libraries, no build step.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This was built using &lt;strong&gt;&lt;a href="https://antigravity.dev" rel="noopener noreferrer"&gt;Antigravity&lt;/a&gt;&lt;/strong&gt; — a vibe coding tool powered by &lt;strong&gt;Google Gemini 2.0 Pro&lt;/strong&gt; — with a deliberate "Single File → Split Architecture" workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Globe Rendering Pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The globe is a layered SVG with groups for ocean, land, clouds, ice caps, smog, fire, and now a &lt;code&gt;face-group&lt;/code&gt; on top. Each &lt;code&gt;requestAnimationFrame&lt;/code&gt; tick, the renderer recomputes ocean color, shifts atmosphere hue, translates continents and clouds for rotation, calculates biome visibility, and renders fire particles when conditions are right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Earth's Emotional Face&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The face is a set of SVG elements (&lt;code&gt;&amp;lt;ellipse&amp;gt;&lt;/code&gt; eyes, &lt;code&gt;&amp;lt;rect&amp;gt;&lt;/code&gt; brows, &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; mouth) that get imperatively updated on every slider change. The &lt;code&gt;calcScore()&lt;/code&gt; result drives which expression state is applied — 5 tiers from happy to dying. Eyebrows rotate via CSS &lt;code&gt;transform&lt;/code&gt;, the mouth path &lt;code&gt;d&lt;/code&gt; attribute changes shape, and at critical danger the mouth switches to a wavy path with a &lt;code&gt;wobbleMouth&lt;/code&gt; CSS keyframe animation for that extra distress effect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Orbiting Moon&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The moon orbits on an ellipse (&lt;code&gt;rx: 155, ry: 45&lt;/code&gt;) centered on the globe using a &lt;code&gt;moonAngle&lt;/code&gt; counter that increments each frame. The depth-sorting trick: if &lt;code&gt;moonY &amp;gt; 130&lt;/code&gt; (front half of orbit), the moon group is &lt;code&gt;appendChild&lt;/code&gt;-ed to the end of the SVG so it renders above Earth; otherwise it's &lt;code&gt;insertBefore&lt;/code&gt; the ocean layer so it appears behind. The moon's own pupils shift horizontally to always look away from Earth — a small touch that makes it feel alive. Animated sweat drops (&lt;code&gt;slideSweat&lt;/code&gt; keyframe) appear on the moon's face when Earth's score drops below 50.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Simulation Math&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The 10-year engine applies weighted penalties per variable per year:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Base +80M/yr&lt;/span&gt;
&lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;forest&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sea&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;energy&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;growth&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ice&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The UI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Orbitron + Space Mono for a command-center sci-fi feel. CSS starfield background, reactive glow shadows on the globe, and all slider tracks fill dynamically with the current condition color.&lt;/p&gt;

&lt;h2&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%2F2gy5b47j6mcuvoqvdchc.png" alt="simulation result" width="800" height="705"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Challenges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SVG Depth Sorting for the Moon&lt;/strong&gt; — SVG renders in document order, not by Z-index. Getting the moon to appear behind Earth on the back half of its orbit required dynamically re-inserting the moon group into the SVG DOM each frame based on its Y position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Face Expressiveness in SVG&lt;/strong&gt; — Making emotions readable at 260px required careful tuning of path coordinates. The eyebrow rotation pivot point matters a lot — &lt;code&gt;transform-origin&lt;/code&gt; had to be set relative to each brow's center, not the SVG origin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Balancing the Simulation Math&lt;/strong&gt; — The formula needed to feel consequential without being instantly catastrophic. The current weights were iterated ~8 times to hit the right dramatic tension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-File 60fps Performance&lt;/strong&gt; — Keeping the entire render loop smooth without any virtual DOM or external state management meant being surgical about what gets recomputed each frame vs. what's event-driven on slider input.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;🏆 Best Use of Google Gemini&lt;/strong&gt; — Built using Antigravity, powered by Google Gemini 2.0 Pro as its underlying model for code generation and iteration.&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>showdev</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>NotJS: If It's Not JavaScript, It's a Teapot</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Sun, 05 Apr 2026 16:29:22 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/notjs-if-its-not-javascript-its-a-teapot-54m5</link>
      <guid>https://dev.to/rohan_mirjankar/notjs-if-its-not-javascript-its-a-teapot-54m5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge 🫖&lt;/a&gt;&lt;/em&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%2F57fyts8t5ma8xfl5vhgj.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%2F57fyts8t5ma8xfl5vhgj.png" alt="Preview" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;NotJS&lt;/strong&gt; — a dead-serious code analyzer that does exactly one thing: tells you whether your code is JavaScript or not.&lt;/p&gt;

&lt;p&gt;Does it compile your code? No. Does it run it? Absolutely not. Does it parse an AST? Not even close. It reads your code, runs it through a highly sophisticated™ scoring algorithm (keyword spotting + vibes), and either congratulates you for writing JavaScript or hits you with an &lt;code&gt;HTTP 418 I'm a Teapot&lt;/code&gt; for daring to submit Python/Java/Rust/literally anything else.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A fake "analysis" progress bar with fake terminal logs that say things like &lt;em&gt;"Cross-referencing ECMAScript spec..."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;A confidence meter that always hits &lt;strong&gt;99.99% NOT JAVASCRIPT&lt;/strong&gt; for non-JS code&lt;/li&gt;
&lt;li&gt;A "Convert to JavaScript" button that redirects you to Google Translate&lt;/li&gt;
&lt;li&gt;A toast that just says &lt;em&gt;"Just learn JavaScript bro."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built on the core belief that JavaScript is the only language that matters.&lt;/p&gt;

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

&lt;p&gt;🔗 &lt;a href="https://rohan-shridhar.github.io/NotJS/" rel="noopener noreferrer"&gt;Live Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript submitted:&lt;/strong&gt; &lt;code&gt;200 OK — JavaScript Detected Successfully. Excellent choice. Superior language.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Submitted some other language:&lt;/strong&gt; &lt;code&gt;418 I'm a Teapot — Cannot process non-JavaScript input&lt;/code&gt;&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Rohan-Shridhar" rel="noopener noreferrer"&gt;
        Rohan-Shridhar
      &lt;/a&gt; / &lt;a href="https://github.com/Rohan-Shridhar/NotJS" rel="noopener noreferrer"&gt;
        NotJS
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      JS code recogniser - Build something completely useless
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;NotJS 🚫&lt;/h1&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;If it's not JavaScript, it's a teapot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A dead-serious code analyzer that does exactly one thing — detect whether your code is JavaScript or not.&lt;/p&gt;
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/187615922/583544578-be91fb18-a085-4be5-9f08-c40640b3172c.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI0MDA0MDMsIm5iZiI6MTc4MjQwMDEwMywicGF0aCI6Ii8xODc2MTU5MjIvNTgzNTQ0NTc4LWJlOTFmYjE4LWEwODUtNGJlNS05ZjA4LWM0MDY0MGIzMTcyYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNjI1JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDYyNVQxNTA4MjNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lOTY2NDM2NWVmNDlhYmNiMjI0MWE4ZWI0YzE5OTViNjU0ZGVmNmM5OTg1ZjEwOGNiY2UxOWJhNjM3YjMyNWI5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.4VjVtkZQlyBAHFgA6YPB75h81C689aUxjtl5r6kHvY8"&gt;&lt;img width="400" alt="image" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F187615922%2F583544578-be91fb18-a085-4be5-9f08-c40640b3172c.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3ODI0MDA0MDMsIm5iZiI6MTc4MjQwMDEwMywicGF0aCI6Ii8xODc2MTU5MjIvNTgzNTQ0NTc4LWJlOTFmYjE4LWEwODUtNGJlNS05ZjA4LWM0MDY0MGIzMTcyYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwNjI1JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDYyNVQxNTA4MjNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lOTY2NDM2NWVmNDlhYmNiMjI0MWE4ZWI0YzE5OTViNjU0ZGVmNmM5OTg1ZjEwOGNiY2UxOWJhNjM3YjMyNWI5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZyZXNwb25zZS1jb250ZW50LXR5cGU9aW1hZ2UlMkZwbmcifQ.4VjVtkZQlyBAHFgA6YPB75h81C689aUxjtl5r6kHvY8"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Fake terminal analysis with fake logs&lt;/li&gt;
&lt;li&gt;Scoring engine based on JS keywords, APIs, and vibes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;418 I'm a Teapot&lt;/code&gt; for Python, Java, Rust, and all other inferior languages&lt;/li&gt;
&lt;li&gt;"Convert to JavaScript" button (opens Google Translate)&lt;/li&gt;
&lt;li&gt;Toast message: &lt;em&gt;"Just learn JavaScript bro."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;99.99% confidence. Always.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Stack&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;React 18 (no build step)&lt;/li&gt;
&lt;li&gt;Vanilla CSS&lt;/li&gt;
&lt;li&gt;IBM Plex Mono&lt;/li&gt;
&lt;li&gt;Zero backend. Maximum bias.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Built for&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://dev.to/challenges/aprilfools-2026" rel="nofollow"&gt;DEV April Fools Challenge 2026&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;MIT — but morally, only JavaScript projects should use this.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Rohan-Shridhar/NotJS" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;Built with &lt;strong&gt;React 18&lt;/strong&gt; (via Babel standalone, no build step), vanilla CSS, and a deep personal vendetta against other programming languages.&lt;/p&gt;

&lt;p&gt;The "analysis engine" (&lt;code&gt;computeScore&lt;/code&gt;) is a scoring function that awards points for JS keywords (&lt;code&gt;const&lt;/code&gt;, &lt;code&gt;let&lt;/code&gt;, &lt;code&gt;=&amp;gt;&lt;/code&gt;, &lt;code&gt;async/await&lt;/code&gt;), built-in APIs (&lt;code&gt;console.log&lt;/code&gt;, &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;localStorage&lt;/code&gt;), and syntax patterns (template literals, optional chaining, spread). It deducts points for anti-patterns from Python, Java, C++, PHP, and Rust. Score ≥ 3 = JavaScript. Score &amp;lt; 3 = teapot.&lt;/p&gt;

&lt;p&gt;The UI is a fake terminal — yellow/black JS branding, typewriter headings, animated progress bar, scrolling fake logs. Every screen has an entry animation. The error screen has two buttons: one that shames you before letting you retry, and one that pretends to "convert" your code while opening Google Translate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React 18 (UMD + Babel standalone)&lt;/li&gt;
&lt;li&gt;IBM Plex Mono, Space Grotesk, Syne (Google Fonts)&lt;/li&gt;
&lt;li&gt;Vanilla CSS (no Tailwind, no UI libs)&lt;/li&gt;
&lt;li&gt;Zero backend. Zero actual analysis. Maximum confidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Community Favorite&lt;/strong&gt; — because nothing brings developers together like the shared delusion that their language is the best one. NotJS is a love letter to JavaScript supremacy, a participation trophy for JS devs, and a gentle (aggressive) nudge for everyone else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Ode to Larry Masinter&lt;/strong&gt; — Larry Masinter authored RFC 2324, the original 418 I'm a Teapot joke RFC from 1998. NotJS is essentially a shrine to that bit. The entire error screen is built around 418, complete with a fake HTTP response payload, a confidence meter, and a redirect to Google Translate as the "conversion engine." Larry planted the seed. NotJS watered it with JavaScript bias.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Most Developers Misjudge Their Skill Level — Here’s How to Actually Know</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Mon, 16 Mar 2026 10:34:57 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/most-developers-misjudge-their-skill-level-heres-how-to-actually-know-4nih</link>
      <guid>https://dev.to/rohan_mirjankar/most-developers-misjudge-their-skill-level-heres-how-to-actually-know-4nih</guid>
      <description>&lt;h3&gt;
  
  
  TL;DR for busy folks
&lt;/h3&gt;

&lt;p&gt;Developers often wonder when they stop being beginners and become intermediate or advanced.&lt;/p&gt;

&lt;p&gt;This article explains the real differences between these stages, how problem-solving and thinking evolve as developers gain experience, and why factors like imposter syndrome and job titles can make it difficult to judge your level accurately.&lt;/p&gt;

&lt;p&gt;The key idea: &lt;strong&gt;growth in development is defined by how you think about problems, not just the tools you use.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Famqt54.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%2Fi.imgflip.com%2Famqt54.jpg" title="made at imgflip.com" width="619" height="403"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Question Every Developer Asks
&lt;/h2&gt;

&lt;p&gt;At some point in every developer’s journey, the same question appears:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Am I still a beginner?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unlike traditional professions, software development doesn’t have clear milestones. There’s no official exam that upgrades you from &lt;em&gt;beginner → intermediate → advanced&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Most developers try to measure their skill level based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Years of experience
&lt;/li&gt;
&lt;li&gt;Number of programming languages known
&lt;/li&gt;
&lt;li&gt;Complexity of projects
&lt;/li&gt;
&lt;li&gt;Job titles
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But these metrics are &lt;strong&gt;misleading&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A developer with &lt;strong&gt;5 years of experience can still be a beginner in mindset&lt;/strong&gt;, while someone with &lt;strong&gt;2 years of focused problem-solving may already operate at an intermediate level&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The real difference between levels isn’t about &lt;strong&gt;how much code you write&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s about &lt;strong&gt;how you think about problems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What “Beginner Developer” Actually Means
&lt;/h2&gt;

&lt;p&gt;A lot of developers misunderstand what “beginner” really means.&lt;/p&gt;

&lt;p&gt;It doesn’t mean you’re bad at programming.&lt;/p&gt;

&lt;p&gt;It simply means &lt;strong&gt;your brain is still learning how programming problems work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Beginner developers usually operate at the &lt;strong&gt;syntax level&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They think about questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What function should I use?
&lt;/li&gt;
&lt;li&gt;What syntax fixes this error?
&lt;/li&gt;
&lt;li&gt;How do I implement this feature?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their workflow often looks 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;Idea → Search Tutorial → Try Code → Error → Debug → Works
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that cycle repeats many times.&lt;/p&gt;

&lt;p&gt;What matters most at this stage is &lt;strong&gt;practice through projects&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not courses.&lt;br&gt;&lt;br&gt;
Not theory.&lt;/p&gt;

&lt;p&gt;Projects.&lt;/p&gt;

&lt;p&gt;Because every project teaches you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debugging
&lt;/li&gt;
&lt;li&gt;reading documentation
&lt;/li&gt;
&lt;li&gt;connecting different tools together
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those skills are what slowly move a developer from &lt;strong&gt;beginner → intermediate&lt;/strong&gt;.&lt;/p&gt;

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


&lt;h2&gt;
  
  
  The Turning Point to Intermediate
&lt;/h2&gt;

&lt;p&gt;The transition from &lt;strong&gt;beginner to intermediate developer&lt;/strong&gt; doesn’t happen when you learn a new language or framework.&lt;/p&gt;

&lt;p&gt;It happens when you start &lt;strong&gt;understanding problems instead of just copying solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At this stage, developers begin to recognize patterns in programming problems. Instead of searching for exact solutions, they start thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’ve seen something similar before. I know how to approach this.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This shift usually happens after building several real projects.&lt;/p&gt;
&lt;h3&gt;
  
  
  Signs You're Becoming an Intermediate Developer
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. You Can Debug Without Immediately Searching the Internet
&lt;/h4&gt;

&lt;p&gt;Beginners often search the exact error message.&lt;/p&gt;

&lt;p&gt;Intermediate developers usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;read the stack trace
&lt;/li&gt;
&lt;li&gt;identify where the problem originates
&lt;/li&gt;
&lt;li&gt;isolate the issue step-by-step
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Debugging becomes &lt;strong&gt;a logical process rather than trial and error&lt;/strong&gt;.&lt;/p&gt;


&lt;h4&gt;
  
  
  2. You Start Writing Cleaner Code
&lt;/h4&gt;

&lt;p&gt;Intermediate developers begin to care about things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code readability
&lt;/li&gt;
&lt;li&gt;proper function structure
&lt;/li&gt;
&lt;li&gt;meaningful variable names
&lt;/li&gt;
&lt;li&gt;avoiding duplicated logic
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Beginner style&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Intermediate style&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adultUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The functionality is the same, but the &lt;strong&gt;code communicates intent more clearly&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  3. You Stop Relying Completely on Tutorials
&lt;/h4&gt;

&lt;p&gt;A major turning point happens when developers stop building projects only by following tutorials.&lt;/p&gt;

&lt;p&gt;Instead, they start doing things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading documentation
&lt;/li&gt;
&lt;li&gt;designing their own project features
&lt;/li&gt;
&lt;li&gt;experimenting with different approaches
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tutorials become &lt;strong&gt;references&lt;/strong&gt;, not step-by-step guides.&lt;/p&gt;




&lt;h4&gt;
  
  
  4. You Understand &lt;em&gt;Why&lt;/em&gt; Code Works
&lt;/h4&gt;

&lt;p&gt;Beginners often focus on &lt;strong&gt;what works&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Intermediate developers begin asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why does this algorithm work?
&lt;/li&gt;
&lt;li&gt;Why is this API structured this way?
&lt;/li&gt;
&lt;li&gt;Why is this approach faster?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This deeper understanding helps them solve &lt;strong&gt;completely new problems&lt;/strong&gt;.&lt;/p&gt;




&lt;h4&gt;
  
  
  5. You Start Thinking About Structure
&lt;/h4&gt;

&lt;p&gt;Instead of writing everything in one file, intermediate developers start organizing code into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modules
&lt;/li&gt;
&lt;li&gt;reusable functions
&lt;/li&gt;
&lt;li&gt;components
&lt;/li&gt;
&lt;li&gt;services
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is usually the first step toward understanding &lt;strong&gt;software architecture&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Things Advanced Developers Do Differently
&lt;/h2&gt;

&lt;p&gt;Advanced developers aren’t defined by the number of languages they know.&lt;/p&gt;

&lt;p&gt;What really separates them is &lt;strong&gt;how they approach systems, trade-offs, and long-term maintainability&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Famqs40.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%2Fi.imgflip.com%2Famqs40.jpg" title="made at imgflip.com" width="500" height="883"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this stage, developers move beyond writing features and start thinking about &lt;strong&gt;designing software&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. They Think in Systems, Not Just Code
&lt;/h3&gt;

&lt;p&gt;Beginners focus on functions.&lt;br&gt;&lt;br&gt;
Intermediate developers focus on modules.&lt;br&gt;&lt;br&gt;
Advanced developers focus on &lt;strong&gt;systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do I implement this feature?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How will this feature affect the system?
&lt;/li&gt;
&lt;li&gt;Will this scale with more users?
&lt;/li&gt;
&lt;li&gt;How maintainable will this be in 6 months?
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  2. They Make Decisions Based on Trade-offs
&lt;/h3&gt;

&lt;p&gt;There is rarely a &lt;strong&gt;perfect solution&lt;/strong&gt; in software.&lt;/p&gt;

&lt;p&gt;Advanced developers understand trade-offs such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;performance vs readability
&lt;/li&gt;
&lt;li&gt;simplicity vs flexibility
&lt;/li&gt;
&lt;li&gt;speed of development vs scalability
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  3. They Write Code for Other Developers
&lt;/h3&gt;

&lt;p&gt;Beginner mindset:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Does the code work?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Advanced mindset:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Will other developers understand this?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They prioritize:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear naming
&lt;/li&gt;
&lt;li&gt;modular architecture
&lt;/li&gt;
&lt;li&gt;documentation
&lt;/li&gt;
&lt;li&gt;maintainability
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  4. They Anticipate Problems Early
&lt;/h3&gt;

&lt;p&gt;Advanced developers often detect issues &lt;strong&gt;before they happen&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;performance bottlenecks
&lt;/li&gt;
&lt;li&gt;scaling problems
&lt;/li&gt;
&lt;li&gt;security vulnerabilities
&lt;/li&gt;
&lt;li&gt;tightly coupled code
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  5. They Focus on Architecture
&lt;/h3&gt;

&lt;p&gt;At this level, developers think about questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Should this be a &lt;strong&gt;microservice or monolith&lt;/strong&gt;?
&lt;/li&gt;
&lt;li&gt;How should the &lt;strong&gt;API be structured&lt;/strong&gt;?
&lt;/li&gt;
&lt;li&gt;How will &lt;strong&gt;data flow through the system&lt;/strong&gt;?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their thinking moves from &lt;strong&gt;writing code → designing solutions&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Most Developers Misjudge Their Level?
&lt;/h2&gt;

&lt;p&gt;One of the biggest problems in software development is that &lt;strong&gt;developers often misjudge their own skill level&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some beginners think they’re already advanced.&lt;br&gt;&lt;br&gt;
Some experienced developers still think they’re beginners.&lt;/p&gt;

&lt;p&gt;This happens because of &lt;strong&gt;two major factors&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Psychology
&lt;/li&gt;
&lt;li&gt;Industry expectations
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  The Psychology Problem (Dunning–Kruger Effect)
&lt;/h3&gt;

&lt;p&gt;In psychology, there is a concept called the &lt;strong&gt;Dunning–Kruger Effect&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;It explains why people with &lt;strong&gt;low experience sometimes overestimate their ability&lt;/strong&gt;, while people with &lt;strong&gt;higher experience often underestimate themselves&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The journey often looks something 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;Beginner → “Programming is easy”
Intermediate → “Programming is harder than I thought”
Advanced → “The more I learn, the more I realize I don’t know”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  The Imposter Syndrome Trap
&lt;/h3&gt;

&lt;p&gt;Even skilled developers sometimes feel like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;they don't know enough
&lt;/li&gt;
&lt;li&gt;someone will expose them as "not a real developer"
&lt;/li&gt;
&lt;li&gt;everyone else understands things better
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is extremely common in development.&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%2Fi.imgflip.com%2Famqrmd.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%2Fi.imgflip.com%2Famqrmd.jpg" title="made at imgflip.com" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Job Titles Are Misleading
&lt;/h3&gt;

&lt;p&gt;Different companies define levels very differently.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;someone with &lt;strong&gt;2 years of experience&lt;/strong&gt; might be called &lt;em&gt;Senior Developer&lt;/em&gt; at a startup
&lt;/li&gt;
&lt;li&gt;someone with &lt;strong&gt;8 years of experience&lt;/strong&gt; might still be called &lt;em&gt;Mid-Level Developer&lt;/em&gt; at a large tech company
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Job titles are &lt;strong&gt;not reliable indicators of skill level&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Famqrf7.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%2Fi.imgflip.com%2Famqrf7.jpg" title="made at imgflip.com" width="500" height="624"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Technology ≠ Skill Level
&lt;/h3&gt;

&lt;p&gt;Knowing many tools doesn’t necessarily mean understanding &lt;strong&gt;software engineering deeply&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Advanced developers focus more on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;problem solving
&lt;/li&gt;
&lt;li&gt;architecture
&lt;/li&gt;
&lt;li&gt;scalability
&lt;/li&gt;
&lt;li&gt;design patterns
&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%2Fi.imgflip.com%2Famqr6t.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%2Fi.imgflip.com%2Famqr6t.jpg" title="made at imgflip.com" width="506" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  A Simple Self-Check Framework
&lt;/h2&gt;

&lt;p&gt;Instead of judging your level based on &lt;strong&gt;experience or technologies&lt;/strong&gt;, try evaluating &lt;strong&gt;how you approach the same problem&lt;/strong&gt;.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Build a &lt;strong&gt;Task Manager API&lt;/strong&gt; where users can create, update, and delete tasks.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  Beginner Approach
&lt;/h3&gt;

&lt;p&gt;Typical workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Idea → Search tutorial → Copy example → Modify code → Make it work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/task&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;
  &lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Task added&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, but may lack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validation
&lt;/li&gt;
&lt;li&gt;structure
&lt;/li&gt;
&lt;li&gt;scalability
&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%2Fi.imgflip.com%2Famqsds.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%2Fi.imgflip.com%2Famqsds.jpg" title="made at imgflip.com" width="500" height="763"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Intermediate Approach
&lt;/h3&gt;

&lt;p&gt;Intermediate developers focus on &lt;strong&gt;structure&lt;/strong&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/tasks&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;taskController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createTask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;taskService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They introduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;controllers
&lt;/li&gt;
&lt;li&gt;services
&lt;/li&gt;
&lt;li&gt;modular structure
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Advanced Approach
&lt;/h3&gt;

&lt;p&gt;Advanced developers start thinking about &lt;strong&gt;system design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Questions they ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How will this scale?
&lt;/li&gt;
&lt;li&gt;Should caching be used?
&lt;/li&gt;
&lt;li&gt;What about authentication?
&lt;/li&gt;
&lt;li&gt;How should services communicate?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example architecture thinking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API Gateway → Auth Service → Task Service → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;In software development, the difference between &lt;strong&gt;beginner, intermediate, and advanced developers&lt;/strong&gt; isn’t defined by years of experience or the number of technologies you know.&lt;/p&gt;

&lt;p&gt;It’s defined by &lt;strong&gt;how you think about problems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What matters most isn’t &lt;strong&gt;how fast you progress&lt;/strong&gt;, but whether you keep improving your thinking.&lt;/p&gt;

&lt;p&gt;Because in the end, great developers aren’t defined by the tools they know.&lt;/p&gt;

&lt;p&gt;They’re defined by &lt;strong&gt;the problems they can solve&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Famqsol.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%2Fi.imgflip.com%2Famqsol.jpg" title="made at imgflip.com" width="500" height="651"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Where do you think you are right now — beginner, intermediate, or advanced?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I’d love to hear your thoughts and experiences in the comments.&lt;/p&gt;

</description>
      <category>career</category>
      <category>development</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Rise, Shatter, Lead.</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Mon, 16 Mar 2026 09:00:32 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/rise-shatter-lead-3pi5</link>
      <guid>https://dev.to/rohan_mirjankar/rise-shatter-lead-3pi5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/wecoded-2026"&gt;2026 WeCoded Challenge&lt;/a&gt;: Frontend Art&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What did I build ??
&lt;/h2&gt;




&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/Rohan-Shridhar/embed/raMygbG?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  What inspired me ??
&lt;/h2&gt;

&lt;p&gt;The glass ceiling is one of the most enduring metaphors in gender equity — and I wanted to make it &lt;em&gt;visible&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;"Rise. Shatter. Lead." is an animated tribute to the women who built the technologies we take for granted every day: Grace Hopper, who invented the compiler; Radia Perlman, whose spanning-tree protocol underpins the modern internet; Kimberly Bryant, founder of Black Girls Code; and Reshma Saujani, who launched Girls Who Code. The central figure — &lt;strong&gt;You&lt;/strong&gt; — sits among them deliberately. Because the next pioneer is still writing their story.&lt;/p&gt;

&lt;p&gt;The cracked glass ceiling at the center of the piece isn't decorative. It's a reminder that 27% of the tech workforce being women, and only 18% of tech leadership, isn't a ceiling we've broken yet — it's one we're still cracking.&lt;/p&gt;




&lt;h2&gt;
  
  
  How I built it ??
&lt;/h2&gt;

&lt;p&gt;The latest version of this piece is built entirely in &lt;strong&gt;pure HTML and CSS — no JavaScript whatsoever.&lt;/strong&gt; Every effect you see is driven by the browser's rendering engine alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Star field&lt;/strong&gt; — 70+ stars rendered using nothing but &lt;code&gt;box-shadow&lt;/code&gt; on a single CSS pseudo-element, drifting upward with &lt;code&gt;@keyframes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glass ceiling crack&lt;/strong&gt; — SVG lines drawn with animated &lt;code&gt;stroke-dashoffset&lt;/code&gt;, each crack radiating outward with a staggered &lt;code&gt;animation-delay&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flying shards&lt;/strong&gt; — &lt;code&gt;clip-path: polygon()&lt;/code&gt; triangles that float and rotate away via keyframe animation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cinematic headline reveal&lt;/strong&gt; — each word clips and slides up from a hidden container, staggered for a theatrical entrance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scrolling pioneers ticker&lt;/strong&gt; — a seamlessly looping &lt;code&gt;translateX&lt;/code&gt; animation across a duplicated flex row, no JS scroll listeners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hover tooltips &amp;amp; progress bars&lt;/strong&gt; — pure CSS &lt;code&gt;:hover&lt;/code&gt; cascade triggering child &lt;code&gt;opacity&lt;/code&gt;, &lt;code&gt;transform&lt;/code&gt;, and &lt;code&gt;scaleX&lt;/code&gt; transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted the code itself to be as accessible as the message — no frameworks, no libraries, just the web platform doing what it was built to do.&lt;/p&gt;




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

&lt;p&gt;Full source on CodePen: &lt;a href="https://codepen.io/Rohan-Shridhar/pen/raMygbG" rel="noopener noreferrer"&gt;https://codepen.io/Rohan-Shridhar/pen/raMygbG&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to contribute, check out my repository on GitHub:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Rohan-Shridhar" rel="noopener noreferrer"&gt;
        Rohan-Shridhar
      &lt;/a&gt; / &lt;a href="https://github.com/Rohan-Shridhar/womens-day" rel="noopener noreferrer"&gt;
        womens-day
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Frontend Art: Gender Equity&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Draw what comes to mind for you when you think of gender equity in tech.&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Whether it's a symbolic representation of the "glass ceiling" being shattered, a detailed portrait of a pioneer who paved the way, or a piece of abstract art representing the strength of a diverse community, we want to see your interpretation through code. You may use any frontend tools for this prompt.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to/rohan_mirjankar/rise-shatter-lead-3pi5" rel="nofollow"&gt;View my post&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Rohan-Shridhar/womens-day" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>wecoded</category>
      <category>devchallenge</category>
      <category>frontend</category>
      <category>css</category>
    </item>
    <item>
      <title>I Let AI Write My Code for a Week — I Stopped Understanding My Own Project</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Sun, 08 Mar 2026 17:19:46 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/i-let-ai-write-my-code-for-a-week-i-stopped-understanding-my-own-project-16n2</link>
      <guid>https://dev.to/rohan_mirjankar/i-let-ai-write-my-code-for-a-week-i-stopped-understanding-my-own-project-16n2</guid>
      <description>

&lt;h2&gt;
  
  
  &lt;strong&gt;Mistakes Programmers Do While Using AI For Development&lt;/strong&gt;
&lt;/h2&gt;




&lt;h2&gt;
  
  
  TL;DR for Busy Developers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI can generate code &lt;strong&gt;faster than you can think&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;But debugging AI-written logic is &lt;strong&gt;10× harder&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;AI hides complexity behind confident answers&lt;/li&gt;
&lt;li&gt;If you stop thinking, your skills degrade quickly&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%2Fi.imgflip.com%2Falycfy.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%2Fi.imgflip.com%2Falycfy.jpg" title="made at imgflip.com" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;Like most developers right now, &lt;strong&gt;AI has slowly crept into my workflow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Autocomplete from &lt;strong&gt;Copilot&lt;/strong&gt;, debugging with &lt;strong&gt;ChatGPT&lt;/strong&gt;, and occasionally asking &lt;strong&gt;Gemini&lt;/strong&gt; for alternative solutions.&lt;/p&gt;

&lt;p&gt;Then a slightly dangerous thought crossed my mind.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What would happen if I stopped thinking first… and let AI do most of the work?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I decided to run an experiment.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;one full week&lt;/strong&gt;, I let AI write the majority of the code for a &lt;strong&gt;small MERN stack application&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The twist?&lt;/p&gt;

&lt;p&gt;This was a &lt;strong&gt;real college project&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And at the time, I only knew &lt;strong&gt;basic HTML and CSS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No backend experience.&lt;br&gt;&lt;br&gt;
No React experience.&lt;br&gt;&lt;br&gt;
Just AI tools and a deadline.&lt;/p&gt;

&lt;p&gt;The stack looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;MongoDB&lt;/span&gt;
&lt;span class="nx"&gt;Express&lt;/span&gt;
&lt;span class="nx"&gt;React&lt;/span&gt;
&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;My AI toolchain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; → inline code suggestions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; → debugging and code generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; → alternative solutions and explanations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If AI could generate the code, I wouldn't write it manually.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first, it honestly felt like cheating.&lt;/p&gt;

&lt;p&gt;Features appeared instantly.&lt;/p&gt;

&lt;p&gt;Backend routes? One prompt away.&lt;br&gt;&lt;br&gt;
React components? Generated in seconds.&lt;/p&gt;

&lt;p&gt;But after a couple of days, something weird happened.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I stopped understanding my own project.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9ciq9cisx6x22dkrc5pc.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%2F9ciq9cisx6x22dkrc5pc.png" alt="Structure of the project" width="800" height="490"&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%2Fi.imgflip.com%2Fam2y57.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%2Fi.imgflip.com%2Fam2y57.jpg" title="made at imgflip.com" width="717" height="348"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Rules I Set
&lt;/h2&gt;

&lt;p&gt;Before starting, I needed rules.&lt;/p&gt;

&lt;p&gt;Otherwise I would just fall back to writing code myself.&lt;/p&gt;

&lt;p&gt;So I created four:&lt;/p&gt;

&lt;p&gt;i. &lt;strong&gt;Let AI write first&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't type code until Copilot or ChatGPT generates it.&lt;/p&gt;

&lt;p&gt;ii. &lt;strong&gt;Only debug using AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No Stack Overflow or documentation unless AI suggested it.&lt;/p&gt;

&lt;p&gt;iii. &lt;strong&gt;No outside help&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No classmates.&lt;br&gt;&lt;br&gt;
   No tutorials.&lt;/p&gt;

&lt;p&gt;iv. &lt;strong&gt;Don't refactor working code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If it works, move on — even if it's ugly.&lt;/p&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Can AI carry a beginner — with just HTML and CSS — through a full-stack MERN project?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At first it looked like the answer was yes.&lt;/p&gt;

&lt;p&gt;But the more I followed these rules, the more I noticed something strange.&lt;/p&gt;

&lt;p&gt;The less I thought about the code…&lt;/p&gt;

&lt;p&gt;The more problems started appearing.&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 1: The Magic Phase
&lt;/h2&gt;

&lt;p&gt;Day 1 felt like magic.&lt;/p&gt;

&lt;p&gt;Instead of writing code, I started writing &lt;strong&gt;prompts&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;"Create an Express server with MongoDB connection."&lt;/p&gt;

&lt;p&gt;A few seconds later — done.&lt;/p&gt;

&lt;p&gt;Next prompt:&lt;/p&gt;

&lt;p&gt;"Write an Express route to add and fetch users."&lt;/p&gt;

&lt;p&gt;Done again.&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%2Fa1290hlbuau90mxp8aux.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%2Fa1290hlbuau90mxp8aux.png" alt="Copilot generating  a large chunk of code" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I switched to the frontend, &lt;strong&gt;AI started generating entire React components&lt;/strong&gt; before I finished typing.&lt;/p&gt;

&lt;p&gt;For someone who only knew &lt;strong&gt;HTML and CSS&lt;/strong&gt;, this felt unreal.&lt;/p&gt;

&lt;p&gt;Within a few hours I had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a running &lt;strong&gt;Express server&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a working &lt;strong&gt;MongoDB connection&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;multiple &lt;strong&gt;API routes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;React components displaying data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Normally learning all this would take days.&lt;br&gt;
AI made it feel effortless.&lt;/p&gt;

&lt;p&gt;For a moment, I genuinely thought:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why do people even struggle with full-stack development anymore?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately…&lt;br&gt;
That confidence didn’t last long.&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%2Fi.imgflip.com%2Falydwx.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%2Fi.imgflip.com%2Falydwx.jpg" title="made at imgflip.com" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Day 4: Debugging AI Code Is Painful
&lt;/h2&gt;

&lt;p&gt;By Day 4, something interesting happened.&lt;/p&gt;

&lt;p&gt;Writing code wasn’t the problem anymore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging it was.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Small issues started appearing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API responses returning wrong data&lt;/li&gt;
&lt;li&gt;React state not updating correctly&lt;/li&gt;
&lt;li&gt;MongoDB queries behaving strangely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But most of the code was written by AI.&lt;/p&gt;

&lt;p&gt;Which meant something uncomfortable:&lt;/p&gt;

&lt;p&gt;I didn’t fully understand the logic anymore.&lt;/p&gt;

&lt;p&gt;So I followed my experiment rule — &lt;strong&gt;ask AI to fix it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s when the real problem started.&lt;/p&gt;

&lt;p&gt;The AI would suggest a fix.&lt;/p&gt;

&lt;p&gt;Sometimes it worked.&lt;/p&gt;

&lt;p&gt;Other times it introduced a &lt;strong&gt;new bug somewhere else&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Which created a loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask AI for a fix
&lt;/li&gt;
&lt;li&gt;Apply the solution
&lt;/li&gt;
&lt;li&gt;Something else breaks
&lt;/li&gt;
&lt;li&gt;Ask AI again
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead of debugging my project…&lt;/p&gt;

&lt;p&gt;I was debugging &lt;strong&gt;the AI's suggestions&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Falyeut.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%2Fi.imgflip.com%2Falyeut.jpg" title="made at imgflip.com" width="500" height="756"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Biggest Mistakes Developers Make With AI
&lt;/h2&gt;

&lt;p&gt;After a week of letting AI write most of my code, I noticed a few patterns.&lt;/p&gt;

&lt;p&gt;These mistakes weren't just mine.&lt;/p&gt;

&lt;p&gt;A lot of developers are probably making them.&lt;/p&gt;


&lt;h3&gt;
  
  
  Mistake #1 — Copy-Paste Programming
&lt;/h3&gt;

&lt;p&gt;When AI generates working code, it's tempting to paste it and move on.&lt;/p&gt;

&lt;p&gt;But if you don't understand it, debugging later becomes extremely difficult.&lt;/p&gt;

&lt;p&gt;Working code without understanding is just &lt;strong&gt;delayed confusion&lt;/strong&gt;.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Falyfvm.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%2Fi.imgflip.com%2Falyfvm.jpg" title="made at imgflip.com" width="577" height="432"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Mistake #2 — Trusting AI Explanations Too Much
&lt;/h3&gt;

&lt;p&gt;AI rarely says &lt;strong&gt;"I don't know."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead, it gives confident explanations.&lt;/p&gt;

&lt;p&gt;Even when they aren't completely correct.&lt;/p&gt;

&lt;p&gt;Sometimes ChatGPT and Gemini even gave &lt;strong&gt;different explanations for the same bug&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both sounded convincing.&lt;/p&gt;

&lt;p&gt;Only one could be right.&lt;/p&gt;


&lt;h3&gt;
  
  
  Real Example from the Experiment
&lt;/h3&gt;

&lt;p&gt;Prompt I used:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fix this React state bug where the component doesn't re-render
after updating MongoDB data.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;AI suggestion:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use useEffect to re-fetch data whenever state changes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Infinite re-render loop.&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgflip.com%2Falyff9.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%2Fi.imgflip.com%2Falyff9.jpg" title="made at imgflip.com" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Mistake #3 — Letting AI Design Your Code
&lt;/h3&gt;

&lt;p&gt;AI is good at generating &lt;strong&gt;pieces of code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But it's not great at designing &lt;strong&gt;clean architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Over time this can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;messy logic&lt;/li&gt;
&lt;li&gt;redundant functions&lt;/li&gt;
&lt;li&gt;inconsistent patterns&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%2Fi.imgflip.com%2Fam2yjd.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%2Fi.imgflip.com%2Fam2yjd.jpg" title="made at imgflip.com" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Mistake #4 — Losing the Learning Opportunity
&lt;/h3&gt;

&lt;p&gt;Debugging, reading documentation, and experimenting are how developers learn.&lt;/p&gt;

&lt;p&gt;AI removes a lot of that struggle.&lt;/p&gt;

&lt;p&gt;Which sounds great.&lt;/p&gt;

&lt;p&gt;Until you realize you finished the project without fully understanding the stack.&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%2Fi.imgflip.com%2Falygb6.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%2Fi.imgflip.com%2Falygb6.jpg" title="made at imgflip.com" width="513" height="499"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  When AI Actually Helps 🌟
&lt;/h2&gt;

&lt;p&gt;Despite the problems, AI was still extremely useful.&lt;/p&gt;

&lt;p&gt;The key realization:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI works best as a &lt;strong&gt;productivity tool&lt;/strong&gt;, not a &lt;strong&gt;decision-maker&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI helped most with:&lt;/p&gt;
&lt;h3&gt;
  
  
  Boilerplate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Express server setup&lt;/li&gt;
&lt;li&gt;MongoDB connections&lt;/li&gt;
&lt;li&gt;React component templates&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  Explaining Errors
&lt;/h3&gt;

&lt;p&gt;Instead of decoding long stack traces, I could ask:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Explain this error and possible causes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Even if the answer wasn't perfect, it often pointed me in the right direction.&lt;/p&gt;


&lt;h3&gt;
  
  
  Learning Syntax
&lt;/h3&gt;

&lt;p&gt;AI helped explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React hooks&lt;/li&gt;
&lt;li&gt;Express middleware&lt;/li&gt;
&lt;li&gt;MongoDB queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which made learning new concepts faster.&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%2Fi.imgflip.com%2Fam2xrh.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%2Fi.imgflip.com%2Fam2xrh.jpg" title="made at imgflip.com" width="750" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  My New Rules for Using AI
&lt;/h2&gt;

&lt;p&gt;After this experiment, I didn't stop using AI.&lt;/p&gt;

&lt;p&gt;But I changed &lt;strong&gt;how I use it&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Rule #1 — AI Writes Boilerplate, Not Architecture
&lt;/h3&gt;

&lt;p&gt;AI can generate repetitive code.&lt;/p&gt;

&lt;p&gt;But developers should design the system.&lt;/p&gt;


&lt;h3&gt;
  
  
  Rule #2 — Never Run Code You Don't Understand
&lt;/h3&gt;

&lt;p&gt;If you can't explain it, don't run it.&lt;/p&gt;


&lt;h3&gt;
  
  
  Rule #3 — Debug Yourself First
&lt;/h3&gt;

&lt;p&gt;Try solving the problem manually before asking AI.&lt;/p&gt;


&lt;h3&gt;
  
  
  Rule #4 — Use AI to Learn, Not Skip Learning
&lt;/h3&gt;

&lt;p&gt;Instead of asking AI to solve everything, ask it to explain.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Explain how Express middleware works.
&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%2Fi.imgflip.com%2Falygps.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%2Fi.imgflip.com%2Falygps.jpg" title="made at imgflip.com" width="558" height="447"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Thoughts — AI Should Amplify You, Not Replace You
&lt;/h2&gt;

&lt;p&gt;This experiment started with a simple question:&lt;/p&gt;

&lt;p&gt;What happens if AI writes most of the code?&lt;/p&gt;

&lt;p&gt;After one week, the answer was clear.&lt;/p&gt;

&lt;p&gt;AI can speed up development dramatically.&lt;/p&gt;

&lt;p&gt;But relying on it too heavily creates new problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;harder debugging&lt;/li&gt;
&lt;li&gt;less understanding of your code&lt;/li&gt;
&lt;li&gt;weaker learning of new technologies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is an incredible tool.&lt;/p&gt;

&lt;p&gt;But it should &lt;strong&gt;amplify developers, not replace their thinking&lt;/strong&gt;.&lt;/p&gt;


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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://attendance-tracker-seven-kappa.vercel.app/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;attendance-tracker-seven-kappa.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&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%2F88gt7d8dteho44h70u2l.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%2F88gt7d8dteho44h70u2l.png" alt="Frontend UI" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;Have you ever relied too much on AI while coding?&lt;/p&gt;

&lt;p&gt;What was the weirdest bug AI helped (or failed) to fix?&lt;/p&gt;

&lt;p&gt;Curious to hear other developers’ experiences.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>node</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building a Browser-Based Pixel Art Tool with Gemini</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Tue, 03 Mar 2026 17:18:06 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/building-a-browser-based-pixel-art-tool-with-gemini-4866</link>
      <guid>https://dev.to/rohan_mirjankar/building-a-browser-based-pixel-art-tool-with-gemini-4866</guid>
      <description>&lt;h2&gt;
  
  
  🎨 Gridcraft – A 16x16 Pixel Art Creator Built with Gemini
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Gridcraft&lt;/strong&gt;, a clean and simple 16x16 pixel art creator that runs directly in the browser.&lt;/p&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a smooth pixel drawing experience&lt;/li&gt;
&lt;li&gt;Keep the UI minimal&lt;/li&gt;
&lt;li&gt;Allow exporting without gaps or visual glitches&lt;/li&gt;
&lt;li&gt;Make it beginner-friendly but still polished&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google Gemini wasn’t just generating code — it acted like a thinking partner.&lt;/p&gt;

&lt;p&gt;I used Gemini to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Debug CSS grid behavior&lt;/li&gt;
&lt;li&gt;Refine canvas export logic&lt;/li&gt;
&lt;li&gt;Optimize UI interactions&lt;/li&gt;
&lt;li&gt;Improve project structure&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;🔗 Live Demo: &lt;a href="https://rohan-shridhar.github.io/gridcraft/" rel="noopener noreferrer"&gt;https://rohan-shridhar.github.io/gridcraft/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gridcraft allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draw on a 16×16 grid&lt;/li&gt;
&lt;li&gt;Change colors instantly&lt;/li&gt;
&lt;li&gt;Erase pixels&lt;/li&gt;
&lt;li&gt;Download your artwork cleanly in .png(no grid borders, no spacing issues)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The downloaded image renders exactly as drawn — no weird gaps between cells.&lt;/p&gt;

&lt;p&gt;That detail took real problem-solving.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  1. AI Is a Thinking Accelerator
&lt;/h3&gt;

&lt;p&gt;When I asked vague questions, I got vague results.&lt;br&gt;
When I asked precise technical questions, I got precise solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. UI Details Matter More Than You Think
&lt;/h3&gt;

&lt;p&gt;Tiny things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grid spacing&lt;/li&gt;
&lt;li&gt;Cursor size&lt;/li&gt;
&lt;li&gt;Border radius&lt;/li&gt;
&lt;li&gt;Export rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These make or break the feel of a creative tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Iteration &amp;gt; Perfection
&lt;/h3&gt;

&lt;p&gt;Instead of trying to build everything perfectly at once, I built → tested → refined.&lt;/p&gt;

&lt;p&gt;That workflow worked far better.&lt;/p&gt;




&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;p&gt;What worked well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast debugging help&lt;/li&gt;
&lt;li&gt;Clear explanation of CSS and grid behavior&lt;/li&gt;
&lt;li&gt;Helpful suggestions for structuring logic&lt;/li&gt;
&lt;li&gt;Great for restructuring messy thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where I needed more effort:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had to refine prompts multiple times&lt;/li&gt;
&lt;li&gt;Some UI suggestions needed manual adjustment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, it felt less like “generate everything” and more like “co-build and refine.”&lt;/p&gt;

&lt;p&gt;That’s the right way to use AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Gridcraft started as a small idea.&lt;/p&gt;

&lt;p&gt;Now it’s a working creative tool — deployed, usable, and something I’m proud to ship.&lt;/p&gt;

&lt;p&gt;If you try it, I’d love feedback.&lt;/p&gt;

&lt;p&gt;And yes — it’s open on GitHub.&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Hack, Reflect, Look Forward: Building My Portfolio with Google Gemini + Antigravity</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Tue, 03 Mar 2026 10:24:40 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/hack-reflect-look-forward-building-my-portfolio-with-google-gemini-antigravity-4b8i</link>
      <guid>https://dev.to/rohan_mirjankar/hack-reflect-look-forward-building-my-portfolio-with-google-gemini-antigravity-4b8i</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mlh-built-with-google-gemini-02-25-26"&gt;Built with Google Gemini: Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built with Google Gemini
&lt;/h2&gt;

&lt;p&gt;Instead of building yet another template-based portfolio, I decided to experiment.&lt;/p&gt;

&lt;p&gt;I built my personal Portfolio using Google’s Antigravity along with Google Gemini as my thinking partner, debugger, and architecture assistant.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem:
&lt;/h3&gt;

&lt;p&gt;Most student portfolios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look the same&lt;/li&gt;
&lt;li&gt;Focus more on design than depth&lt;/li&gt;
&lt;li&gt;Don’t clearly communicate thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted mine to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show my technical journey (not just projects)&lt;/li&gt;
&lt;li&gt;Feel modern and interactive&lt;/li&gt;
&lt;li&gt;Reflect how I think as a developer&lt;/li&gt;
&lt;li&gt;Be AI-assisted&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Role of Google Gemini
&lt;/h3&gt;

&lt;p&gt;Gemini  helped me break the portfolio into meaningful sections instead of randomly stacking components. It felt like having a design-thinking partner on demand. It helped me reason through problems instead of just pasting solutions.&lt;br&gt;
Gemini helped me in three major ways:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Architecture Clarity
&lt;/h4&gt;

&lt;p&gt;Before writing code, I asked Gemini to help structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hero section narrative&lt;/li&gt;
&lt;li&gt;Projects showcase logic&lt;/li&gt;
&lt;li&gt;Skills grouping strategy&lt;/li&gt;
&lt;li&gt;GitHub integration ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. UI + Microcopy Iteration
&lt;/h4&gt;

&lt;p&gt;I used Gemini to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refine section headings&lt;/li&gt;
&lt;li&gt;Improve project descriptions&lt;/li&gt;
&lt;li&gt;Make my copy sharper and less generic&lt;/li&gt;
&lt;li&gt;Generate alternative layout ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Debugging + Refinement
&lt;/h4&gt;

&lt;p&gt;While working with Antigravity, I hit issues around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component structuring&lt;/li&gt;
&lt;li&gt;Responsive tweaks&lt;/li&gt;
&lt;li&gt;State management patterns&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  &lt;a href="https://rohan-shridhar.github.io/portfolio" rel="noopener noreferrer"&gt;View demo&lt;/a&gt;
&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%2F5tfws537en8mpata9ekc.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%2F5tfws537en8mpata9ekc.png" alt="portfolio" width="355" height="837"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  You can explore:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;My skills and projects&lt;/li&gt;
&lt;li&gt;GitHub integration&lt;/li&gt;
&lt;li&gt;Clean responsive UI&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  1. AI Is a Thinking Tool, Not a Replacement 🚀
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I realized the quality of output depended on the quality of my thinking.&lt;/li&gt;
&lt;li&gt;When I asked half-baked questions, I got half-baked answers.&lt;/li&gt;
&lt;li&gt;When I explained the problem properly — what I tried, what failed, what constraints I had — the responses became much sharper.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Prompting Is a Technical Skill ✨
&lt;/h3&gt;

&lt;p&gt;Prompting turned out to be a skill of its own.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I learned to break big problems into smaller, focused questions.&lt;/li&gt;
&lt;li&gt;I requested explanations, not just code, so I could actually understand what was happening.&lt;/li&gt;
&lt;li&gt;This improved how I solve problems even without AI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemini helped me move faster — but deciding when something was “good enough” was still my responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Gemini Feedback
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Worked Well:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clear explanations when I asked conceptual questions&lt;/li&gt;
&lt;li&gt;Fast iteration cycles&lt;/li&gt;
&lt;li&gt;Helped me refine ideas instead of just outputting code&lt;/li&gt;
&lt;li&gt;Great for restructuring messy thoughts&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where I Hit Friction:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sometimes responses were too high-level&lt;/li&gt;
&lt;li&gt;Occasionally I had to rephrase prompts for clarity&lt;/li&gt;
&lt;li&gt;Needed to cross-check certain implementation details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That friction improved my clarity. It forced better thinking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let’s keep learning and building 🚀
&lt;/h3&gt;

</description>
      <category>devchallenge</category>
      <category>geminireflections</category>
      <category>gemini</category>
      <category>webdev</category>
    </item>
    <item>
      <title>My first Dev community post 😊</title>
      <dc:creator>Rohan Mirjankar </dc:creator>
      <pubDate>Sat, 28 Feb 2026 04:41:57 +0000</pubDate>
      <link>https://dev.to/rohan_mirjankar/my-first-dev-community-post-3aa7</link>
      <guid>https://dev.to/rohan_mirjankar/my-first-dev-community-post-3aa7</guid>
      <description>&lt;p&gt;If you are a developer and not aware of github &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%2F1ry186sz1qtvpptnssnd.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%2F1ry186sz1qtvpptnssnd.jpg" alt="You dropped your brain" width="736" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
