<?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: Ritanjit Das</title>
    <description>The latest articles on DEV Community by Ritanjit Das (@rtnjt_bot).</description>
    <link>https://dev.to/rtnjt_bot</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3423101%2F6cb50862-83b4-48a5-b6d2-d27ecf726617.jpeg</url>
      <title>DEV Community: Ritanjit Das</title>
      <link>https://dev.to/rtnjt_bot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rtnjt_bot"/>
    <language>en</language>
    <item>
      <title>posted after a long time !</title>
      <dc:creator>Ritanjit Das</dc:creator>
      <pubDate>Thu, 28 May 2026 05:19:46 +0000</pubDate>
      <link>https://dev.to/rtnjt_bot/posted-after-a-long-time--4429</link>
      <guid>https://dev.to/rtnjt_bot/posted-after-a-long-time--4429</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a" class="crayons-story__hidden-navigation-link"&gt;I Got Tired of LeetCode Trackers Selling My Data, So I Built My Own.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/rtnjt_bot" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3423101%2F6cb50862-83b4-48a5-b6d2-d27ecf726617.jpeg" alt="rtnjt_bot profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rtnjt_bot" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ritanjit Das
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ritanjit Das
                
              
              &lt;div id="story-author-preview-content-3768288" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/rtnjt_bot" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3423101%2F6cb50862-83b4-48a5-b6d2-d27ecf726617.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ritanjit Das&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 28&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a" id="article-link-3768288"&gt;
          I Got Tired of LeetCode Trackers Selling My Data, So I Built My Own.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/extensions"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;extensions&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I Got Tired of LeetCode Trackers Selling My Data, So I Built My Own.</title>
      <dc:creator>Ritanjit Das</dc:creator>
      <pubDate>Thu, 28 May 2026 05:15:45 +0000</pubDate>
      <link>https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a</link>
      <guid>https://dev.to/rtnjt_bot/i-got-tired-of-leetcode-trackers-selling-my-data-so-i-built-my-own-262a</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; "Your coding journey is personal. Your data should be too."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Here's a question: when you solve a LeetCode problem at 2 AM, who else knows about it?&lt;/p&gt;

&lt;p&gt;If you're using any of the popular LeetCode tracking tools, the answer is... a lot of people. Your solve history, your weak topics, your streak data, your pacing before interviews — all of it sitting on someone else's server, probably being used to "improve the product" (read: train models, sell insights, serve ads).&lt;/p&gt;

&lt;p&gt;I was using three different tools to track my DSA progress. One required a Google login. Another synced to "the cloud" with no option to export. The third one just... disappeared one day. Along with six months of my progress data.&lt;/p&gt;

&lt;p&gt;That was my breaking point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What If Your LeetCode Tracker Was Just... Yours?
&lt;/h2&gt;

&lt;p&gt;I started building &lt;strong&gt;My DSA Buddy&lt;/strong&gt; — a LeetCode dashboard that runs entirely on &lt;code&gt;localhost&lt;/code&gt;. No accounts. No cloud. No telemetry. Your data lives in a SQLite file on your machine, and the only network request that ever leaves is pushing your solution to your own GitHub repo.&lt;/p&gt;

&lt;p&gt;That's it. That's the entire privacy model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;External network calls: 1 (GitHub push to YOUR repo)
Data stored remotely: 0 bytes
Analytics/tracking: none
Third-party dependencies on user data: zero
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;The system has two parts that talk to each other locally:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A local web dashboard&lt;/strong&gt; (Astro 5 + React 19) running on &lt;code&gt;localhost:4321&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Chrome extension&lt;/strong&gt; that silently detects "Accepted" submissions on LeetCode&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you solve a problem, the extension scrapes the solution, pushes it to your GitHub, and pings your local dashboard to update your stats. The dashboard never touches the internet.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture (For the Nerds)
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;pnpm monorepo&lt;/strong&gt; with Turborepo orchestration. Here's the sync flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌───────────┐  ┌──────────┐  ┌────────────┐  ┌───────────┐
│ LeetCode  │  │ Content  │  │ Background │  │   Local   │
│ Page DOM  │  │  Script  │  │   Worker   │  │ Dashboard │
└─────┬─────┘  └─────┬────┘  └─────┬──────┘  └─────┬─────┘
      │              │             │               │
      │ "Accepted"   │             │               │
      │─────────────&amp;gt;│             │               │
      │              │ sendMessage │               │
      │              │────────────&amp;gt;│               │
      │              │             │               │
      │              │             │─ GitHub API ─&amp;gt;│(ONLY external call)
      │              │             │  PUT solution │
      │              │             │&amp;lt;─ 201 ────────│
      │              │             │               │
      │              │             │ POST /api/sync│
      │              │             │──────────────&amp;gt;│
      │              │             │               │ Update SQLite
      │              │             │               │ Recalculate stats
      │              │             │&amp;lt;──────────────│ 200 OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Astro 5 (SSR, Node adapter)&lt;/td&gt;
&lt;td&gt;Island architecture — only hydrate what's interactive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React 19 islands&lt;/td&gt;
&lt;td&gt;Component-driven dashboard widgets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Styling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tailwind CSS v4.0&lt;/td&gt;
&lt;td&gt;Utility-first, CSS variables, zero runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;better-sqlite3&lt;/td&gt;
&lt;td&gt;Single file, zero config, fast reads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Import&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;csv-parse&lt;/td&gt;
&lt;td&gt;Load company-wise problem lists from CSV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vite + CRXJS (Manifest V3)&lt;/td&gt;
&lt;td&gt;Modern build tooling for Chrome extensions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type Safety&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript 5.9 end-to-end&lt;/td&gt;
&lt;td&gt;Shared types between dashboard and extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monorepo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;pnpm workspaces + Turborepo&lt;/td&gt;
&lt;td&gt;Shared code, parallel builds, caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Animations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Motion (Framer Motion)&lt;/td&gt;
&lt;td&gt;Smooth widget transitions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Data Model
&lt;/h3&gt;

&lt;p&gt;Everything lives in a local SQLite database. Here's the core:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;solved_problems&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTOINCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;problem_id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;difficulty&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;CHECK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;difficulty&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Easy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Medium'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Hard'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="n"&gt;topics&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;-- JSON array&lt;/span&gt;
  &lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;-- JSON array&lt;/span&gt;
  &lt;span class="n"&gt;solved_at&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;language&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;solution&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;github_path&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;daily_progress&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;problems_solved&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;time_spent&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;problem_ids&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;      &lt;span class="c1"&gt;-- JSON array&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No ORM. No migrations server. Just a &lt;code&gt;.db&lt;/code&gt; file you can copy, back up, or delete. Your data, your rules.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Design: A Developer's Journal
&lt;/h2&gt;

&lt;p&gt;I didn't want this to look like another gray SaaS dashboard. I wanted it to feel like opening your personal coding notebook.&lt;/p&gt;

&lt;p&gt;The design system is inspired by &lt;strong&gt;Claude.com's aesthetic&lt;/strong&gt; — warm cream canvas, coral accents, serif display typography. But adapted for a developer context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cream canvas&lt;/strong&gt; (#faf9f5) — warm, deliberate, not the cold gray of typical dev tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coral accent&lt;/strong&gt; (#cc785c) — progress bars, streak highlights, solved badges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark navy surfaces&lt;/strong&gt; (#181715) — code blocks, problem cards, stats panels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cormorant Garamond&lt;/strong&gt; serif for headlines (the "journal" voice)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains Mono&lt;/strong&gt; prominently for stats, IDs, code (the "developer" signal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full dark mode&lt;/strong&gt; with View Transition API circular reveal animation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is something that feels like a curated study journal rather than a cluttered analytics tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* The design system in CSS variables */&lt;/span&gt;
&lt;span class="k"&gt;@theme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--color-canvas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#faf9f5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#cc785c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-surface-dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#181715&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-difficulty-easy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#5db872&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-difficulty-medium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#d4a017&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-difficulty-hard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#c64545&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;h2&gt;
  
  
  What's Built (And What's Not — Yet)
&lt;/h2&gt;

&lt;p&gt;I believe in being honest. Here's the current state:&lt;/p&gt;

&lt;h3&gt;
  
  
  Done
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Complete design system (CSS variables, dark mode, component classes, animations)&lt;/li&gt;
&lt;li&gt;Full TypeScript type definitions (Problem, Roadmap, Progress, Settings, SyncPayload)&lt;/li&gt;
&lt;li&gt;Monorepo architecture with shared code between dashboard and extension&lt;/li&gt;
&lt;li&gt;Chrome extension skeleton (Manifest V3, content script, background worker, popup)&lt;/li&gt;
&lt;li&gt;Base layouts and landing page&lt;/li&gt;
&lt;li&gt;Extension-to-dashboard communication protocol&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  In Progress
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard widgets (ProgressOverview, StreakCalendar, StatsPanel)&lt;/li&gt;
&lt;li&gt;SQLite database layer and API routes&lt;/li&gt;
&lt;li&gt;Problem list with filters (difficulty, topic, company, status)&lt;/li&gt;
&lt;li&gt;Company-wise roadmap cards&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Planned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full Chrome extension DOM extraction (LeetCode scraping)&lt;/li&gt;
&lt;li&gt;GitHub push integration&lt;/li&gt;
&lt;li&gt;Settings page (PAT config, theme, sync preferences)&lt;/li&gt;
&lt;li&gt;Data export/import&lt;/li&gt;
&lt;li&gt;Streak tracking and milestone badges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This is where you come in.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Source This Early?
&lt;/h2&gt;

&lt;p&gt;Because the best open-source projects aren't built by one person in isolation. They're shaped by the community from day one.&lt;/p&gt;

&lt;p&gt;I'm releasing this now — architecture solid, design system complete, implementation in progress — because I want contributors who can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shape the UX&lt;/strong&gt; before it's locked in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bring domain expertise&lt;/strong&gt; (LeetCode DOM structure, Chrome extension best practices, SQLite optimization)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenge my decisions&lt;/strong&gt; (Should I use Dexie.js instead of better-sqlite3 for the extension? Is Astro the right choice? Should the streak algorithm work differently?)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Good First Issues
&lt;/h3&gt;

&lt;p&gt;If you want to contribute, here are concrete starting points:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Difficulty&lt;/th&gt;
&lt;th&gt;Skills&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build the &lt;code&gt;ProgressRing&lt;/code&gt; SVG component&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;React, SVG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement the streak calendar (365-day heatmap)&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;React, CSS Grid/SVG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create the SQLite schema initialization script&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;SQL, Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build the &lt;code&gt;/api/sync&lt;/code&gt; endpoint&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Astro API routes, better-sqlite3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implement LeetCode DOM extraction (content script)&lt;/td&gt;
&lt;td&gt;Hard&lt;/td&gt;
&lt;td&gt;DOM APIs, Chrome Extensions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add CSV problem list files (Google, Amazon, Meta)&lt;/td&gt;
&lt;td&gt;Easy&lt;/td&gt;
&lt;td&gt;Data collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build the floating navbar with scroll animation&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;React, CSS transitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark mode theme toggle with View Transition API&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;React, CSS, Web APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Questions for the Community
&lt;/h2&gt;

&lt;p&gt;I'd genuinely love feedback on these decisions. Drop a comment if you have thoughts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. SQLite vs IndexedDB for the extension's local cache?&lt;/strong&gt;&lt;br&gt;
Currently the dashboard uses better-sqlite3 (Node.js), but the extension might benefit from IndexedDB (via Dexie.js) for its own local state. Is the complexity worth it, or should the extension just always ping localhost?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Is the "single external network call" philosophy too strict?&lt;/strong&gt;&lt;br&gt;
Right now, GitHub push is the only thing that leaves your machine. But what about optional features like LeetCode API calls for problem metadata, or optional cloud backup? Should these exist as opt-in, or does that dilute the privacy promise?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Astro SSR on localhost — overkill?&lt;/strong&gt;&lt;br&gt;
I chose Astro with the Node adapter for island architecture and server-side data loading. But for a purely local app, would a Vite + React SPA with a separate Express API be simpler? What's your take?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What features would make YOU switch from your current tracker?&lt;/strong&gt;&lt;br&gt;
Seriously — what's the one thing that would make you actually use this daily?&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It / Contribute
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and run locally&lt;/span&gt;
git clone https://github.com/Ritanjit/My_DSA_Buddy.git
&lt;span class="nb"&gt;cd &lt;/span&gt;my-dsa-buddy
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;pnpm dev

&lt;span class="c"&gt;# Dashboard runs on localhost:4321&lt;/span&gt;
&lt;span class="c"&gt;# Extension builds to apps/chrome-extension/dist/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Ritanjit/My_DSA_Buddy.git" rel="noopener noreferrer"&gt;https://github.com/Ritanjit/My_DSA_Buddy.git&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;License: MIT&lt;/li&gt;
&lt;li&gt;Issues: &lt;a href="https://github.com/Ritanjit/My_DSA_Buddy.git/issues" rel="noopener noreferrer"&gt;https://github.com/Ritanjit/My_DSA_Buddy.git/issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this resonates with you — if you've ever felt uneasy about where your coding data goes — give it a star. Or better yet, pick an issue and submit a PR. The architecture is ready. The design system is ready. We just need builders.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;"Privacy isn't a feature. It's a right. Your DSA journey shouldn't require surrendering it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks for reading. Whether you contribute code, drop a suggestion in the comments, or just star the repo — it all helps. Let's build something that respects developers' data by default, not as an afterthought.&lt;/p&gt;

&lt;p&gt;Happy grinding, and even happier data ownership.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Astro 5, React 19, TypeScript, Tailwind CSS v4.0, better-sqlite3, and a healthy distrust of "free" cloud services.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>extensions</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>First blog post :)</title>
      <dc:creator>Ritanjit Das</dc:creator>
      <pubDate>Sat, 30 Aug 2025 10:16:17 +0000</pubDate>
      <link>https://dev.to/rtnjt_bot/first-blog-post--5d60</link>
      <guid>https://dev.to/rtnjt_bot/first-blog-post--5d60</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m" class="crayons-story__hidden-navigation-link"&gt;From HTML to 3D: Why I Rebuild My Portfolio with React, Vite, Tailwind &amp;amp; FrontQL&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/rtnjt_bot" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3423101%2F6cb50862-83b4-48a5-b6d2-d27ecf726617.jpeg" alt="rtnjt_bot profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rtnjt_bot" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ritanjit Das
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ritanjit Das
                
              
              &lt;div id="story-author-preview-content-2804854" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/rtnjt_bot" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3423101%2F6cb50862-83b4-48a5-b6d2-d27ecf726617.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ritanjit Das&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 28 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m" id="article-link-2804854"&gt;
          From HTML to 3D: Why I Rebuild My Portfolio with React, Vite, Tailwind &amp;amp; FrontQL
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/portfolio"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;portfolio&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;3&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
      <category>portfolio</category>
    </item>
    <item>
      <title>From HTML to 3D: Why I Rebuild My Portfolio with React, Vite, Tailwind &amp; FrontQL</title>
      <dc:creator>Ritanjit Das</dc:creator>
      <pubDate>Thu, 28 Aug 2025 13:12:16 +0000</pubDate>
      <link>https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m</link>
      <guid>https://dev.to/rtnjt_bot/from-html-to-3d-why-i-rebuild-my-portfolio-with-react-vite-tailwind-frontql-a4m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“A portfolio isn’t just a website. It’s your story, your brand, your invitation to connect.” – Every web developer ever (including me)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction: Why I Rebuilt My Portfolio from Scratch
&lt;/h2&gt;

&lt;p&gt;Back in early 2022, my developer journey started with a humble, single-page website: a few lines of HTML, home-baked CSS, and a hint of JavaScript. I hosted it on GitHub Pages at &lt;a href="//ritanjit.github.io/My-Portfolio/"&gt;RD's Portfolio&lt;/a&gt;. It did the job: showcasing projects, sharing my bio, and providing a contact method. But as my skills (and ambitions) grew, the limitations of this static site became glaringly obvious.&lt;/p&gt;

&lt;p&gt;Fast forward to 2025. I rebuilt my personal site from the ground up as a 3D, interactive experience &lt;a href="//aetheria-nu.vercel.app"&gt;Aetheria&lt;/a&gt;. This wasn’t just a “glow up” for my developer identity. It’s a testament to how modern web technologies like React, Vite, TypeScript, Tailwind CSS v4.0, Three.js (via React Three Fiber), FrontQL, and even vanilla CSS can unlock new creative and functional possibilities.&lt;/p&gt;

&lt;p&gt;In this post, you’ll trace my journey step by step, see how and why my development stack evolved, and get a walkthrough of my new portfolio with code and design insights.&lt;/p&gt;

&lt;p&gt;Ready to go from “static site” to “interactive 3D web presence”? Let’s jump in.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;TL;DR&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Old Portfolio: Simple HTML/CSS/JS; hosted free on GitHub Pages. Easy to launch, but limited in interactivity and maintainability.&lt;/li&gt;
&lt;li&gt;New Portfolio: Built as a serverless React app (Vite, TypeScript, Tailwind CSS v4.0 + vanilla CSS, 3D via Three.js/React Three Fiber) with dynamic content (FrontQL API for backendless queries). Deployed on Vercel for instant updates and global speed.&lt;/li&gt;
&lt;li&gt;Key Takeaway: Embracing modern web tools let me tell my story with richer visuals, better UX, and easier site management.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Level Up? My Motivation to Move Beyond Static HTML Portfolio Sites
&lt;/h2&gt;

&lt;p&gt;My original GitHub Pages site taught me the fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hosting a free site:&lt;/strong&gt; No servers or credit cards. Just push to github pages branch and my site was live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Using core web skills:&lt;/strong&gt; HTML for structure, CSS for style, and a few lines of JavaScript for interactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But after a year in the web industry, I wanted more...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency:&lt;/strong&gt; Repeating HTML for every new project or experience became a chore. Changing a color or font meant hunting through raw CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type safety &amp;amp; maintainability:&lt;/strong&gt; I caught myself making silly JS errors—only seeing them in the browser. Refactoring was scary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Despite being simple, my site wasn’t optimized, with neither lazy loading nor code splitting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern Interactivity:&lt;/strong&gt; No dark mode, animations, or dynamic data—unless I hacked it in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also noticed that the most impressive portfolios (from several “Best Portfolio” lists) were moving towards interactive, component-driven UIs. Some even included live 3D scenes that made you pause and explore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson?&lt;/strong&gt; If you want your portfolio to stand out and “tell your story” not just in words but with explorable design, then there’s a better (and more fun) tech stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where I Started: Anatomy of a GitHub Pages Portfolio
&lt;/h2&gt;

&lt;p&gt;Let’s look at what went right (and wrong) with my v1 portfolio.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero cost:&lt;/strong&gt; No servers, no surprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown-friendly:&lt;/strong&gt; For beginners, you can even design a simple portfolio in Markdown, as GitHub will serve up your README as a home page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessible:&lt;/strong&gt; Deploy via Git (push to a branch), visit your .github.io URL, done!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual HTML editing:&lt;/strong&gt; Every update meant diving back into raw code. No components, no templates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic forms:&lt;/strong&gt; You could add a , but processing submissions required third-party tools (like Formspree) or APIs and more often, nothing happened at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No smart data:&lt;/strong&gt; If my tech stack changed, I had to find-and-replace throughout the site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No build process:&lt;/strong&gt; All CSS and JS was loaded, no code splitting or tree shaking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited interaction:&lt;/strong&gt; Hover effects and toggles? Sure, but no animations, modals, or live 3D magic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A Look at the Source: Static Portfolio Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- index.html --&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Portfolio | Ritanjit&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"styles.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Ritanjit&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;nav&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;About&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#projects"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Projects&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#experience"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Experience&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Contact&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"about"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"projects"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"experience"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"contact"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;footer&amp;gt;&lt;/span&gt;© 2023 Ritanjit. Hosted on GitHub Pages.&lt;span class="nt"&gt;&amp;lt;/footer&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"main.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; Everything is in one file; “components” are hand-built sections, and updating navigation or content in one place means updating in several files by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this stack: Breakdown of the tools I used.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Fast, Fluid &amp;amp; Maintainable&lt;/em&gt; - My new stack isn’t just more powerful - it saves time, prevents bugs, supercharges site performance, and makes dynamic features trivial.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Vite: Lightning-Fast Builds &amp;amp; “Just Works” Developer Experience&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why I chose it?&lt;/strong&gt; Vite is so instant, I’ve forgotten what it’s like to wait on a build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How its so fast?&lt;/strong&gt; Vite provides instant local dev server launches, hot module replacement (HMR), and production builds that are significantly smaller/faster than Create React App or Webpack.
&lt;strong&gt;Fun Fact:&lt;/strong&gt; In my benchmark, Vite was 58% faster at startup than CRA for a TypeScript + React app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;React + TypeScript: Components, Type Safety, and Happiness&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why TypeScript?&lt;/strong&gt; Because the future you will thank you for catching typos and bad data before they ship.&lt;/li&gt;
&lt;li&gt;With Re-usable components, it means updates or new pages are painless.&lt;/li&gt;
&lt;li&gt;Hot reload is delightful, just update a component and see it propagate instantly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tailwind CSS v4.0: The Next Evolution of Styling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Why you ask?&lt;/strong&gt; Because you write less CSS and get more out of every class.&lt;/li&gt;
&lt;li&gt;With 3D transforms and container queries, you can animate in 3D, adapt layouts to any container size, and use utilities like &lt;code&gt;rotate-x-*&lt;/code&gt;, &lt;code&gt;scale-z-*&lt;/code&gt;, &lt;code&gt;@container&lt;/code&gt; without using any plugins required.&lt;/li&gt;
&lt;li&gt;The cherry on top: Use built-in imports and true CSS variables to share design tokens sitewide.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* globals.css */&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@theme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--brand-blue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;oklch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.8&lt;/span&gt; &lt;span class="m"&gt;0.12&lt;/span&gt; &lt;span class="m"&gt;250&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;--header-font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Inter'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;/* 3D rotation: */&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt;@apply&lt;/span&gt; &lt;span class="err"&gt;rotate-x-12&lt;/span&gt; &lt;span class="err"&gt;scale-z-110&lt;/span&gt; &lt;span class="err"&gt;transition-all;&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;FrontQL: The Serverless Backend Solution&lt;/strong&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%2Ff0uvf5ozjvz16vubbc2j.webp" 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%2Ff0uvf5ozjvz16vubbc2j.webp" alt="FrontQL: Shifting Backend Ownership to the Frontend" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What is it?&lt;/strong&gt; A revolutionary tech to build Full Stack apps using only frontend tools, with direct SQL access, scalable workflows, and zero backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why?&lt;/strong&gt; I can insert new contact messages, fetch project data, or even live stats by using SQL directly in the frontend, without requiring my own backend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is it Secure?&lt;/strong&gt; With role-based access and declarative rules, it ensures proper permission management and abstraction of backend operations like scaling and authentication.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUsers&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;response&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;Api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&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="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SELECT * FROM users WHERE id=?&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;{id}&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;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eyJIkpXVCJ9.eyJpZN30.8q8fdsKs9...&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&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;&lt;strong&gt;Three.js and React Three Fiber: Bringing Your Story to Life&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Nothing says ‘future-proof’ like a 3D hero section that is responsive to both desktop and mobile screens.”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three.js&lt;/strong&gt; renders real-time 3D graphics, but what truly unlocked productivity was &lt;strong&gt;React Three Fiber (R3F)&lt;/strong&gt;, a renderer that makes 3D just another React component.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage:&lt;/strong&gt; Hero section, project previews, 3D globe, or interactive timeline animations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Lazy loaded and tuned for devices. R3F makes it easy to display a static fallback if WebGL isn’t supported (progressive enhancement).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Structure Example:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Inside Hero3D.tsx&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ambientLight&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MyAnimatedModel&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OrbitControls&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Takeaways &amp;amp; Advice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If your site feels hard to update, or can’t express your new ideas, that’s a signal to modernize.&lt;/li&gt;
&lt;li&gt;Don’t be intimidated by the latest tools. Vite, React, Tailwind v4.0, and FrontQL are actually simpler (and safer) than the jQuery/DOM setup I started with.&lt;/li&gt;
&lt;li&gt;Lean on utility-first CSS and component-driven UI to maximize creativity and speed.&lt;/li&gt;
&lt;li&gt;Start small, iterate fast and document your milestones with others, not in code, but in design and the storytelling. The feedback will both inspire and shape your next version.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading! I hope my journey inspires your next leap, whether it’s a single Tailwind utility, a React hook, or your first spinning cube on the web.&lt;/p&gt;

&lt;p&gt;Happy building and even happier storytelling :)&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>typescript</category>
      <category>portfolio</category>
    </item>
  </channel>
</rss>
