<?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: Courage Labhani Paul</title>
    <description>The latest articles on DEV Community by Courage Labhani Paul (@paulthedev).</description>
    <link>https://dev.to/paulthedev</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%2F2858628%2F2dfa8787-7fee-47ce-98da-64c479c5f394.jpg</url>
      <title>DEV Community: Courage Labhani Paul</title>
      <link>https://dev.to/paulthedev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulthedev"/>
    <language>en</language>
    <item>
      <title>I Built the Same App 5 Ways: Cursor vs Claude Code vs Windsurf vs Replit Agent vs GitHub Copilot (2026 Showdown)</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Thu, 26 Feb 2026 12:27:46 +0000</pubDate>
      <link>https://dev.to/paulthedev/i-built-the-same-app-5-ways-cursor-vs-claude-code-vs-windsurf-vs-replit-agent-vs-github-copilot-50m2</link>
      <guid>https://dev.to/paulthedev/i-built-the-same-app-5-ways-cursor-vs-claude-code-vs-windsurf-vs-replit-agent-vs-github-copilot-50m2</guid>
      <description>&lt;p&gt;Everyone has opinions about AI coding tools. Very few have data.&lt;/p&gt;

&lt;p&gt;I got tired of the "Cursor is best" / "No, Claude Code is best" / "Actually Windsurf..." debates, so I did something stupid: I built the exact same application five times, with five different tools, and measured everything.&lt;/p&gt;

&lt;p&gt;Here's what I learned.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The App:&lt;/strong&gt; A task management dashboard with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User authentication (email/password + OAuth)&lt;/li&gt;
&lt;li&gt;CRUD operations for tasks&lt;/li&gt;
&lt;li&gt;Real-time updates&lt;/li&gt;
&lt;li&gt;Team collaboration features&lt;/li&gt;
&lt;li&gt;Mobile-responsive UI&lt;/li&gt;
&lt;li&gt;Basic analytics dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Stack:&lt;/strong&gt; Next.js 14, TypeScript, Prisma, PostgreSQL, Tailwind CSS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same spec document for all tools&lt;/li&gt;
&lt;li&gt;Same 8-hour time limit&lt;/li&gt;
&lt;li&gt;Same starting point (empty directory)&lt;/li&gt;
&lt;li&gt;No manual coding except for config files&lt;/li&gt;
&lt;li&gt;All prompting done in natural language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I Measured:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time to working MVP&lt;/li&gt;
&lt;li&gt;Lines of code generated&lt;/li&gt;
&lt;li&gt;TypeScript errors on first compile&lt;/li&gt;
&lt;li&gt;Runtime bugs found in testing&lt;/li&gt;
&lt;li&gt;Code quality score (SonarQube)&lt;/li&gt;
&lt;li&gt;Security vulnerabilities (Snyk)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #1: Cursor (Composer Mode)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Version tested:&lt;/strong&gt; Cursor 0.43 with Claude 3.5 Sonnet&lt;/p&gt;

&lt;p&gt;Cursor has been the darling of AI coding for the past year, and for good reason. Composer mode, where it can edit multiple files simultaneously is genuinely magical when it works.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Build Experience
&lt;/h3&gt;

&lt;p&gt;I started with: "Create a Next.js 14 task management app with authentication, real-time updates, and team collaboration."&lt;/p&gt;

&lt;p&gt;Cursor's first response? A complete project scaffold with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;App Router structure&lt;/li&gt;
&lt;li&gt;Prisma schema&lt;/li&gt;
&lt;li&gt;Auth setup (NextAuth)&lt;/li&gt;
&lt;li&gt;Basic CRUD API routes&lt;/li&gt;
&lt;li&gt;A surprisingly nice UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time to first working page:&lt;/strong&gt; 12 minutes&lt;/p&gt;

&lt;p&gt;I was impressed. Then I started testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where It Shined
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI generation:&lt;/strong&gt; Cursor produced the best-looking interface of all five tools. The Tailwind usage was clean and consistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File coordination:&lt;/strong&gt; When I asked for a new feature, it correctly updated the schema, API routes, and frontend together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error recovery:&lt;/strong&gt; When I pointed out bugs, it usually fixed them on the first try.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Struggled
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Authentication edge cases:&lt;/strong&gt; The initial OAuth setup worked, but session handling had gaps. Tokens weren't refreshing correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time features:&lt;/strong&gt; It defaulted to polling instead of WebSockets, even when I specifically asked for real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database migrations:&lt;/strong&gt; Generated migrations that worked locally but failed in production due to column ordering issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to MVP&lt;/td&gt;
&lt;td&gt;4h 23m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of Code&lt;/td&gt;
&lt;td&gt;3,847&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript Errors (first compile)&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Bugs Found&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SonarQube Score&lt;/td&gt;
&lt;td&gt;B (74/100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Issues&lt;/td&gt;
&lt;td&gt;3 (1 high, 2 medium)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The high-severity security issue:&lt;/strong&gt; An exposed API route that didn't check authentication. Oops.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #2: Claude Code (CLI)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Version tested:&lt;/strong&gt; Claude Code 1.0.23 with Claude 3.5 Sonnet&lt;/p&gt;

&lt;p&gt;Claude Code is Anthropic's terminal-based coding agent. It's less visual than Cursor but more autonomous, you can tell it to "build X" and walk away.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Build Experience
&lt;/h3&gt;

&lt;p&gt;Same starting prompt. Very different approach.&lt;/p&gt;

&lt;p&gt;Claude Code asked clarifying questions first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Should I use the App Router or Pages Router?"&lt;/li&gt;
&lt;li&gt;"Do you want email/password auth, OAuth, or both?"&lt;/li&gt;
&lt;li&gt;"Real-time via WebSockets or Server-Sent Events?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This took an extra 10 minutes upfront but saved me hours later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time to first working page:&lt;/strong&gt; 27 minutes&lt;/p&gt;

&lt;p&gt;Slower start, but the foundation was solid.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where It Shined
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Architecture:&lt;/strong&gt; Claude Code's generated code was the most maintainable of all five. Clear separation of concerns, consistent patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling:&lt;/strong&gt; It actually included try/catch blocks and meaningful error messages. Revolutionary, I know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; It generated JSDoc comments and a README without being asked.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Struggled
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI polish:&lt;/strong&gt; The interface was functional but ugly. Tailwind usage was inconsistent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; Being terminal-based, the feedback loop was slower. No instant previews.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex refactors:&lt;/strong&gt; When I asked it to restructure the authentication system, it got confused about which files it had already modified.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to MVP&lt;/td&gt;
&lt;td&gt;5h 12m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of Code&lt;/td&gt;
&lt;td&gt;4,231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript Errors (first compile)&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Bugs Found&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SonarQube Score&lt;/td&gt;
&lt;td&gt;A (86/100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Issues&lt;/td&gt;
&lt;td&gt;1 (medium)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Highest code quality of the bunch.&lt;/strong&gt; Slowest to pretty, though.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #3: Windsurf (by Codeium)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Version tested:&lt;/strong&gt; Windsurf 1.2.1&lt;/p&gt;

&lt;p&gt;Windsurf markets itself as having "flows" persistent context that remembers your entire project history. In theory, this solves the "AI forgets what it did yesterday" problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Build Experience
&lt;/h3&gt;

&lt;p&gt;Windsurf's onboarding was slick. It analyzed my project type and suggested a tech stack before I asked.&lt;/p&gt;

&lt;p&gt;The "flow" concept worked... sometimes. When I asked for a feature, it referenced code it had written earlier. When I asked to modify that feature, it often forgot the context entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time to first working page:&lt;/strong&gt; 18 minutes&lt;/p&gt;

&lt;h3&gt;
  
  
  Where It Shined
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; Windsurf was the fastest at generating initial code. The autocomplete is snappy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explanations:&lt;/strong&gt; Every code block came with comments explaining what it did and why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE integration:&lt;/strong&gt; The VS Code-like interface felt familiar and polished.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Struggled
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency:&lt;/strong&gt; The "flows" weren't as persistent as advertised. After ~30 minutes of work, it started contradicting itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex logic:&lt;/strong&gt; Business logic for team permissions was a mess. It generated five different permission-checking approaches across the codebase.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; When I asked for tests, it generated tests for the wrong components.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to MVP&lt;/td&gt;
&lt;td&gt;3h 58m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of Code&lt;/td&gt;
&lt;td&gt;3,612&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript Errors (first compile)&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Bugs Found&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SonarQube Score&lt;/td&gt;
&lt;td&gt;C (62/100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Issues&lt;/td&gt;
&lt;td&gt;4 (2 high, 2 medium)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Fastest to "working," but "working" is generous here.&lt;/strong&gt; The security issues included hardcoded API keys in the frontend. 😬&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #4: Replit Agent
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Version tested:&lt;/strong&gt; Replit Agent (December 2025)&lt;/p&gt;

&lt;p&gt;Replit Agent is different. It's not just a coding assistant, it's an autonomous agent that deploys your app too. Tell it what you want, and it builds, tests, and ships.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Build Experience
&lt;/h3&gt;

&lt;p&gt;The promise: "Describe your app, then go get coffee."&lt;/p&gt;

&lt;p&gt;The reality: "Describe your app, watch it work for 20 minutes, realize it went down the wrong path, start over."&lt;/p&gt;

&lt;p&gt;Replit Agent made bold decisions without asking. It chose a completely different database (MongoDB instead of PostgreSQL), implemented auth differently than I specified, and styled everything with its own CSS instead of Tailwind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time to first working page:&lt;/strong&gt; 34 minutes&lt;/p&gt;

&lt;p&gt;But it was deployed and live. That's something.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where It Shined
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;End-to-end:&lt;/strong&gt; No other tool gave me a deployed, publicly accessible app this fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure:&lt;/strong&gt; Database provisioning, environment variables, deployment all handled automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iteration speed:&lt;/strong&gt; Once it understood the project, small changes were instant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Struggled
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Control:&lt;/strong&gt; I felt like a passenger. When it made wrong decisions, correcting them was harder than starting fresh.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; The generated code was not optimized. Pages that should load in 200ms took 2+ seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor lock-in:&lt;/strong&gt; The generated code was tightly coupled to Replit's infrastructure. Moving it elsewhere would require significant refactoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to MVP&lt;/td&gt;
&lt;td&gt;4h 47m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of Code&lt;/td&gt;
&lt;td&gt;2,891&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript Errors (first compile)&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Bugs Found&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SonarQube Score&lt;/td&gt;
&lt;td&gt;C (58/100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Issues&lt;/td&gt;
&lt;td&gt;2 (1 high, 1 medium)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best for prototypes you'll throw away.&lt;/strong&gt; Worst for production code you'll maintain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool #5: GitHub Copilot (Agent Mode)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Version tested:&lt;/strong&gt; Copilot Agent in VS Code (January 2026)&lt;/p&gt;

&lt;p&gt;GitHub Copilot has been around longest, but Agent Mode, where it can execute multi-step plans is relatively new.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Build Experience
&lt;/h3&gt;

&lt;p&gt;Copilot Agent felt like the most "professional" option. Less magic, more predictable. It generated code incrementally, asking for confirmation at each step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time to first working page:&lt;/strong&gt; 22 minutes&lt;/p&gt;

&lt;h3&gt;
  
  
  Where It Shined
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predictability:&lt;/strong&gt; I always knew what it was doing and why. No surprises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration:&lt;/strong&gt; GitHub integration was seamless. It understood my existing workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing:&lt;/strong&gt; Generated the most comprehensive test suite of all five tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Struggled
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ambition:&lt;/strong&gt; It was conservative. Features I got in one prompt with other tools took 3-4 with Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern patterns:&lt;/strong&gt; It defaulted to older Next.js patterns. Took explicit prompting to use App Router features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; The slowest at raw code generation. It thinks before it types.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Numbers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time to MVP&lt;/td&gt;
&lt;td&gt;5h 56m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines of Code&lt;/td&gt;
&lt;td&gt;4,456&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript Errors (first compile)&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime Bugs Found&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SonarQube Score&lt;/td&gt;
&lt;td&gt;A (89/100)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Issues&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Slowest to MVP. Best quality. Zero security issues.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Final Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Time to MVP&lt;/th&gt;
&lt;th&gt;Code Quality&lt;/th&gt;
&lt;th&gt;Bugs&lt;/th&gt;
&lt;th&gt;Security Issues&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cursor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4h 23m&lt;/td&gt;
&lt;td&gt;B (74)&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Fast iteration, nice UI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5h 12m&lt;/td&gt;
&lt;td&gt;A (86)&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Maintainable production code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windsurf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3h 58m&lt;/td&gt;
&lt;td&gt;C (62)&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Quick prototypes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Replit Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4h 47m&lt;/td&gt;
&lt;td&gt;C (58)&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Deployed demos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5h 56m&lt;/td&gt;
&lt;td&gt;A (89)&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Production-ready enterprise code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  My Honest Recommendations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Side Projects &amp;amp; Experiments
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Winner: Cursor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The UI generation is unmatched. The speed is great. The code quality issues don't matter if you're building something to learn or demo.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Production Code You'll Maintain
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Winner: GitHub Copilot (Agent Mode)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, it's slower. Yes, it's less flashy. But zero security issues and the highest code quality score mean fewer 3 AM debugging sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runner-up: Claude Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you can live with the terminal interface, Claude Code's architectural decisions are consistently excellent. The code reads like a senior developer wrote it.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Rapid Prototyping
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Winner: Windsurf&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need something to show investors tomorrow and don't care about technical debt, Windsurf will get you there fastest.&lt;/p&gt;

&lt;h3&gt;
  
  
  For Non-Developers / "Vibe Coding"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Winner: Replit Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you genuinely don't want to touch code and just want a deployed app, Replit Agent is the only tool that delivers end-to-end without you opening a terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Actually Use
&lt;/h2&gt;

&lt;p&gt;Here's my honest setup going into 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot&lt;/strong&gt; for production work at my day job&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor&lt;/strong&gt; for side projects and UI-heavy features&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for complex refactoring and architectural decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't use a single tool for everything. The best results come from knowing each tool's strengths and picking accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;All five tools produced code with bugs. All of them made architectural decisions I wouldn't have made. All of them required human review and correction.&lt;/p&gt;

&lt;p&gt;The hype says AI coding tools will replace developers. The reality is they make experienced developers faster and inexperienced developers dangerous.&lt;/p&gt;

&lt;p&gt;These tools are productivity multipliers, not productivity replacements. A 10x engineer with AI becomes a 20x engineer. A 0.1x engineer with AI is still 0.1x, just with more code to debug.&lt;/p&gt;

&lt;p&gt;Choose your tools wisely. And always, always review what they generate.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Which AI coding tool are you using? Did these results surprise you? Let me know in the comments.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Vibe Coding Hangover Is Real: What Nobody Tells You About AI-Generated Code in Production</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Thu, 08 Jan 2026 09:39:34 +0000</pubDate>
      <link>https://dev.to/paulthedev/the-vibe-coding-hangover-is-real-what-nobody-tells-you-about-ai-generated-code-in-production-399h</link>
      <guid>https://dev.to/paulthedev/the-vibe-coding-hangover-is-real-what-nobody-tells-you-about-ai-generated-code-in-production-399h</guid>
      <description>&lt;p&gt;Last month, a startup founder sent me their codebase for review. "Built in a weekend with Cursor," he said proudly. "Ready for our Series A demo."&lt;/p&gt;

&lt;p&gt;I opened the repo. Thirty seconds later, I closed Slack and poured myself a drink.&lt;/p&gt;

&lt;p&gt;The code worked. That wasn't the problem. The problem was that it worked &lt;em&gt;for now&lt;/em&gt; held together by duct tape, prayers, and whatever hallucination Claude had that Tuesday afternoon.&lt;/p&gt;

&lt;p&gt;This is the vibe coding hangover. And if you've shipped AI-generated code to production this year, you might already be feeling it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Vibe Coding, Really?
&lt;/h2&gt;

&lt;p&gt;The term exploded in early 2025 after Andrej Karpathy tweeted about "fully giving in to the vibes" and "forgetting that the code even exists."&lt;/p&gt;

&lt;p&gt;Collins Dictionary just named it their 2025 Word of the Year.&lt;/p&gt;

&lt;p&gt;And now 84% of developers are using AI coding tools daily.&lt;/p&gt;

&lt;p&gt;But here's what nobody talks about: there are actually &lt;strong&gt;two definitions&lt;/strong&gt; of vibe coding floating around, and conflating them is causing chaos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definition 1: The Meme&lt;/strong&gt;&lt;br&gt;
"I don't read the code. I just accept what the AI gives me and move on."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Definition 2: The Reality&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
"I use AI to generate boilerplate faster, but I still review everything and understand what's happening."&lt;/p&gt;

&lt;p&gt;Most of the horror stories come from Definition 1. Most of the productivity gains come from Definition 2.&lt;/p&gt;

&lt;p&gt;The problem? Everyone &lt;em&gt;thinks&lt;/em&gt; they're doing Definition 2.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 5 Patterns I See in Every Vibe-Coded Disaster
&lt;/h2&gt;

&lt;p&gt;After reviewing 15+ vibe-coded projects this year, from weekend hacks to funded startups, I've identified the recurring nightmares.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. The "It Works On My Machine" Illusion
&lt;/h3&gt;

&lt;p&gt;AI is exceptionally good at solving the &lt;strong&gt;happy path&lt;/strong&gt;. Ask Claude to build a login form, and you'll get a beautiful login form that works perfectly when users enter valid emails and correct passwords.&lt;/p&gt;

&lt;p&gt;Ask what happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone pastes 50,000 characters into the email field&lt;/li&gt;
&lt;li&gt;The database connection times out mid-authentication&lt;/li&gt;
&lt;li&gt;A user double-clicks the submit button&lt;/li&gt;
&lt;li&gt;The session expires between form load and submission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crickets.&lt;/p&gt;

&lt;p&gt;I reviewed a payment processing flow last month. The AI-generated code handled successful payments flawlessly. Failed payments? The error handling was literally:&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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Something went wrong&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;That was it. In a payment system. Handling real money.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Architectural Amnesia
&lt;/h3&gt;

&lt;p&gt;Here's the dirty secret: &lt;strong&gt;AI doesn't remember your architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every prompt is a fresh start. So when you ask for Feature A on Monday, then Feature B on Tuesday, then Feature C on Wednesday, you get three features that each make perfect sense in isolation and absolute chaos when combined.&lt;/p&gt;

&lt;p&gt;I've seen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Three different state management approaches in one React app&lt;/li&gt;
&lt;li&gt;Database queries that bypass the ORM you set up specifically for security&lt;/li&gt;
&lt;li&gt;Authentication logic duplicated (differently) in 7 places&lt;/li&gt;
&lt;li&gt;API endpoints that return data in 4 different formats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI solves each problem optimally for &lt;em&gt;that problem&lt;/em&gt;. It has no concept of "we decided to do it this way for a reason."&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Security Time Bomb
&lt;/h3&gt;

&lt;p&gt;This one keeps me up at night.&lt;/p&gt;

&lt;p&gt;A Swedish vibe coding platform called Lovable had a security audit earlier this year. Out of 1,645 applications built with the tool, &lt;strong&gt;170 had vulnerabilities&lt;/strong&gt; that would expose user data to anyone who looked.&lt;/p&gt;

&lt;p&gt;That's a 10% critical failure rate. On apps that founders thought were production-ready.&lt;/p&gt;

&lt;p&gt;The patterns I see constantly:&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;// AI-generated "authentication"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAdmin&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;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;admin&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// AI-generated "database query"&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`SELECT * FROM users WHERE id = &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&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="c1"&gt;// AI-generated "file upload"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filename&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;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;originalname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`./uploads/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;filename&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="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each of these is a security 101 failure. SQL injection. Path traversal. Privilege escalation via query parameter.&lt;/p&gt;

&lt;p&gt;But they work! They pass manual testing! The demo looks great!&lt;/p&gt;

&lt;p&gt;Until someone actually tries to exploit them.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Debugging Nightmare
&lt;/h3&gt;

&lt;p&gt;A developer who reviewed a vibe-coded app told me: &lt;strong&gt;"Debugging AI-generated code is harder than writing it manually."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why? Because when you write code, you build a mental model of how it works. You know why that variable is named &lt;code&gt;tempBuffer&lt;/code&gt;. You remember that edge case you handled on line 47.&lt;/p&gt;

&lt;p&gt;With vibe-coded projects, you're debugging someone else's code except that "someone else" doesn't exist. There's no one to ask, "why did you do it this way?" The AI that wrote it has no memory of the conversation.&lt;/p&gt;

&lt;p&gt;I spent 6 hours last month hunting a bug in a vibe-coded codebase. The issue? Two functions with nearly identical names (&lt;code&gt;processUserData&lt;/code&gt; and &lt;code&gt;processUserInfo&lt;/code&gt;) that did completely different things. One was called in production. The other was the one that actually worked correctly.&lt;/p&gt;

&lt;p&gt;The AI had generated both at different times, solving the same problem differently, and the developer never noticed.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The Spaghetti Avalanche
&lt;/h3&gt;

&lt;p&gt;Every AI coding tool has a different "style." Some prefer functional approaches. Some love classes. Some generate comments, some don't. Some use async/await, some use .then() chains.&lt;/p&gt;

&lt;p&gt;When you vibe code over weeks or months, you end up with a codebase that looks like it was written by a team of 50 developers who never talked to each other, because that's essentially what happened.&lt;/p&gt;

&lt;p&gt;I reviewed a Next.js app where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some API routes used the App Router patterns&lt;/li&gt;
&lt;li&gt;Some used Pages Router patterns
&lt;/li&gt;
&lt;li&gt;Some were raw Express middleware somehow shoved into both&lt;/li&gt;
&lt;li&gt;The data fetching used SWR, React Query, AND raw fetch in different components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each piece worked. Together, they were unmaintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers Don't Lie
&lt;/h2&gt;

&lt;p&gt;Let's talk about what the research actually shows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Productivity Myth:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yes, AI-assisted coding can cut development time by 25-50% in controlled studies. But Google's DORA research found that in real-world enterprise settings, teams using AI assistants heavily actually showed &lt;strong&gt;slower delivery times&lt;/strong&gt; once you factor in debugging and rework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Quality Gap:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Microsoft and IBM both estimate that ~20-30% of their code is now AI-generated. But IBM's CEO specifically said that's where the percentage will &lt;em&gt;stay&lt;/em&gt; because the maintenance burden of AI code makes higher percentages unsustainable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The $1.5 Trillion Problem:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Industry analysts are projecting $1.5 trillion in accumulated technical debt from AI-generated code by 2027. That's not a typo. Trillion, with a T.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Actually Works?
&lt;/h2&gt;

&lt;p&gt;I'm not anti-AI coding. I use Cursor and Claude Code daily. But I use them very differently than the "vibe coding" meme suggests.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "AI Conductor" Approach
&lt;/h3&gt;

&lt;p&gt;Think of yourself as an orchestra conductor, not a passenger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AI should do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate boilerplate you'd write anyway&lt;/li&gt;
&lt;li&gt;Suggest approaches you can evaluate&lt;/li&gt;
&lt;li&gt;Write tests for logic you understand&lt;/li&gt;
&lt;li&gt;Explain code you're reviewing&lt;/li&gt;
&lt;li&gt;Refactor working code to be cleaner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What AI should NOT do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make architectural decisions&lt;/li&gt;
&lt;li&gt;Handle security-critical paths without review&lt;/li&gt;
&lt;li&gt;Generate code you can't explain&lt;/li&gt;
&lt;li&gt;Write business logic you haven't specified precisely&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The 30-Second Rule
&lt;/h3&gt;

&lt;p&gt;Before accepting any AI-generated code, I ask myself: &lt;strong&gt;"Could I explain what this does to a junior developer in 30 seconds?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is no, I don't merge it. Period.&lt;/p&gt;

&lt;p&gt;This single rule has saved me from probably 80% of the bugs I would have shipped otherwise.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Review Ritual
&lt;/h3&gt;

&lt;p&gt;Every piece of AI-generated code gets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A read-through&lt;/strong&gt; - Do I understand every line?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An edge case check&lt;/strong&gt; - What happens with null/undefined/empty/huge inputs?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A security glance&lt;/strong&gt; - Is this handling user input safely?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An architecture fit&lt;/strong&gt; - Does this match how we do things in this codebase?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It takes 5 minutes. It's saved me hundreds of hours of debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Talk About Junior Developers
&lt;/h2&gt;

&lt;p&gt;This is where I get controversial.&lt;/p&gt;

&lt;p&gt;The vibe coding explosion is going to hurt junior developers more than anyone. Here's why:&lt;/p&gt;

&lt;p&gt;When senior developers use AI, they're outsourcing typing, not thinking. They know what good code looks like. They can evaluate AI output against years of pattern recognition.&lt;/p&gt;

&lt;p&gt;When junior developers use AI, they're outsourcing &lt;em&gt;learning&lt;/em&gt;. They're skipping the part where you understand why things work. And that creates a skills gap that widens every day.&lt;/p&gt;

&lt;p&gt;I've interviewed junior developers this year who could "build anything with AI" but couldn't explain how a for loop works. They could prompt their way to a working app but couldn't debug it when something broke.&lt;/p&gt;

&lt;p&gt;That's not preparation for a career. That's preparation for obsolescence.&lt;/p&gt;

&lt;p&gt;My advice to new developers: &lt;strong&gt;Learn the fundamentals first.&lt;/strong&gt; Use AI as a tool, not a crutch. The developers who will thrive in 2026 and beyond are the ones who understand enough to know when the AI is wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Vibe coding isn't inherently good or bad. It's a tool, and like all tools, the outcome depends on who's wielding it.&lt;/p&gt;

&lt;p&gt;If you're an experienced developer using AI to accelerate work you understand deeply...great. You're probably more productive than ever.&lt;/p&gt;

&lt;p&gt;If you're shipping AI-generated code you don't fully understand to production, you're building on sand. The hangover is coming. It might be next week. It might be next year. But it's coming.&lt;/p&gt;

&lt;p&gt;The question isn't whether AI changes how we code. It already has.&lt;/p&gt;

&lt;p&gt;The question is whether you're using it as a power tool or as an excuse to skip the hard parts.&lt;/p&gt;

&lt;p&gt;Choose wisely.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's been your experience with AI-generated code in production? Have you hit the vibe coding hangover yet? Drop your horror stories (or success stories) in the comments.&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>SvelteKit vs Next.js in 2026: Why the Underdog is Winning (A Developer’s Deep Dive)</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Mon, 15 Dec 2025 16:02:48 +0000</pubDate>
      <link>https://dev.to/paulthedev/sveltekit-vs-nextjs-in-2026-why-the-underdog-is-winning-a-developers-deep-dive-155b</link>
      <guid>https://dev.to/paulthedev/sveltekit-vs-nextjs-in-2026-why-the-underdog-is-winning-a-developers-deep-dive-155b</guid>
      <description>&lt;h2&gt;
  
  
  Why This Comparison Matters in 2026
&lt;/h2&gt;

&lt;p&gt;In 2023, Next.js dominated the full-stack framework space. But in 2026, &lt;strong&gt;SvelteKit is quietly revolutionizing how we build for the web&lt;/strong&gt; and most developers aren’t even talking about it.&lt;/p&gt;

&lt;p&gt;I spent &lt;strong&gt;3 months rebuilding the same SaaS app&lt;/strong&gt; in both frameworks. The results? &lt;strong&gt;SvelteKit wasn’t just faster, it was a game-changer.&lt;/strong&gt; Here’s why.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Performance: SvelteKit Leaves Next.js in the Dust
&lt;/h2&gt;

&lt;p&gt;I ran &lt;strong&gt;real-world tests&lt;/strong&gt; on a production app with 50+ routes, auth, and live updates. Here’s the data:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;SvelteKit&lt;/th&gt;
&lt;th&gt;Next.js (App Router)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time to Interactive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.2s&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundle Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42KB (gzipped)&lt;/td&gt;
&lt;td&gt;120KB (gzipped)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server Load (RPS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,200 req/sec&lt;/td&gt;
&lt;td&gt;850 req/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why the huge difference?&lt;/strong&gt;&lt;br&gt;
SvelteKit &lt;strong&gt;compiles to vanilla JS at build time&lt;/strong&gt;, eliminating React’s runtime overhead. Next.js, even with React Server Components, still ships a heavier bundle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"But what about Next.js’s Edge Runtime?"&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;It’s fast, but SvelteKit does the same with half the config.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Developer Experience: Simplicity vs. Flexibility
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ SvelteKit’s Superpowers:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;useEffect&lt;/code&gt; Hell:&lt;/strong&gt; Reactivity is built-in. Just use &lt;code&gt;$:&lt;/code&gt; and you’re done.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intuitive Data Loading:&lt;/strong&gt; &lt;code&gt;+page.server.js&lt;/code&gt; is &lt;strong&gt;actually simple&lt;/strong&gt;. No &lt;code&gt;getServerSideProps&lt;/code&gt; vs &lt;code&gt;getStaticProps&lt;/code&gt; confusion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Boilerplate:&lt;/strong&gt; No &lt;code&gt;next.config.js&lt;/code&gt;, no &lt;code&gt;_app.js&lt;/code&gt;. Just drop files and go.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚖️ Next.js’s Strengths:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Massive Ecosystem:&lt;/strong&gt; Plugins for auth, analytics, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise Adoption:&lt;/strong&gt; More jobs, more stability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; If you value &lt;strong&gt;speed and simplicity&lt;/strong&gt;, SvelteKit wins. If you need &lt;strong&gt;plug-and-play solutions&lt;/strong&gt;, Next.js is still king.&lt;/p&gt;




&lt;h2&gt;
  
  
  💼 Job Market: SvelteKit is the Hidden Gem
&lt;/h2&gt;

&lt;p&gt;I analyzed &lt;strong&gt;10,000 job postings&lt;/strong&gt; (via LinkedIn and Web3.Career) for "SvelteKit" vs "Next.js" in 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Job Postings&lt;/th&gt;
&lt;th&gt;Avg. Salary (USD)&lt;/th&gt;
&lt;th&gt;Remote Roles (%)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;8,200&lt;/td&gt;
&lt;td&gt;$120K&lt;/td&gt;
&lt;td&gt;65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SvelteKit&lt;/td&gt;
&lt;td&gt;1,800&lt;/td&gt;
&lt;td&gt;$135K&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key Insight:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js dominates in &lt;strong&gt;big tech&lt;/strong&gt; (FAANG, scaling startups).&lt;/li&gt;
&lt;li&gt;SvelteKit is &lt;strong&gt;the secret weapon of indie hackers and high-paying remote gigs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"But 1,800 jobs vs 8,200? That’s not even close!"&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Wrong.&lt;/strong&gt; SvelteKit’s job growth is &lt;strong&gt;300% YoY&lt;/strong&gt;. Next.js? &lt;strong&gt;12%&lt;/strong&gt;. The tide is turning.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔮 The Future: Who’s Betting on What?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SvelteKit’s Roadmap (2026-2027):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native Web Components:&lt;/strong&gt; Ship frameworks as standards-compliant elements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Compilation:&lt;/strong&gt; Auto-optimize your code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge-First Deployments:&lt;/strong&gt; Zero-config deployments anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Next.js’s Counterplay:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React Forget:&lt;/strong&gt; Compile-time optimizations to close the gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turbopack Stability:&lt;/strong&gt; If it delivers, Next.js could reclaim its throne.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prediction:&lt;/strong&gt; By 2027, &lt;strong&gt;SvelteKit will power 30% of new projects&lt;/strong&gt; (up from 5% today).&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Final Verdict: Should You Switch?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Choose SvelteKit if:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;hate complexity&lt;/strong&gt; and want to ship fast.&lt;/li&gt;
&lt;li&gt;You’re building &lt;strong&gt;high-performance apps&lt;/strong&gt; (dashboards, real-time tools).&lt;/li&gt;
&lt;li&gt;You want to &lt;strong&gt;stand out in interviews&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Stick with Next.js if:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You &lt;strong&gt;need job security&lt;/strong&gt; (more opportunities).&lt;/li&gt;
&lt;li&gt;You’re in &lt;strong&gt;enterprise or legacy React codebases&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Learn both.&lt;/strong&gt; The best developers are framework-agnostic. Spend 20% of your time experimenting with SvelteKit, it’ll make you a better React dev too.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗣️ Your Turn: Let’s Debate!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I want to hear from you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have you tried SvelteKit? What was your experience?&lt;/li&gt;
&lt;li&gt;Do you think Next.js can catch up, or is SvelteKit the future?&lt;/li&gt;
&lt;li&gt;What’s holding you back from switching?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drop a comment below,let’s discuss!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>sveltekit</category>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Cloudflare Down: The Single Point of Failure That Crippled X and ChatGPT, Exposing a CDN Vulnerability</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Tue, 18 Nov 2025 14:12:36 +0000</pubDate>
      <link>https://dev.to/paulthedev/cloudflare-down-the-single-point-of-failure-that-crippled-x-and-chatgpt-exposing-a-cdn-5cg4</link>
      <guid>https://dev.to/paulthedev/cloudflare-down-the-single-point-of-failure-that-crippled-x-and-chatgpt-exposing-a-cdn-5cg4</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction: The Immediate Crisis and The Tell-Tale Error&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Today, the digital world received a chilling notification. Attempting to log into services like &lt;strong&gt;X (formerly Twitter)&lt;/strong&gt; or &lt;strong&gt;OpenAI's ChatGPT&lt;/strong&gt; yielded an obscure, yet critical, message: &lt;strong&gt;"Please unblock challenges.cloudflare.com to proceed."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was not an instruction; it was a symptom. Within minutes, it became clear that this specific error was the digital fingerprint of a massive, global &lt;strong&gt;Cloudflare infrastructure failure&lt;/strong&gt;. The service designed to be the internet's shield and speed optimizer became its single, catastrophic point of failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  🕵️‍♂️ Under the Hood: The &lt;em&gt;challenges.cloudflare.com&lt;/em&gt; Breakdown
&lt;/h2&gt;

&lt;p&gt;For the average user, the error is confusing. For developers, it's a terrifying diagnosis.&lt;/p&gt;

&lt;p&gt;The domain &lt;strong&gt;&lt;code&gt;challenges.cloudflare.com&lt;/code&gt;&lt;/strong&gt; is where Cloudflare runs its highly tuned automated security checks—its Web Application Firewall (WAF) challenge—to distinguish human traffic from bot traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Failure Mechanism:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1:&lt;/strong&gt; Your request hits the Cloudflare network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2:&lt;/strong&gt; Cloudflare's WAF triggers a JavaScript challenge (&lt;code&gt;challenges.cloudflare.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 3:&lt;/strong&gt; During the global "internal service degradation," Cloudflare’s core infrastructure failed to process its own validation logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Result:&lt;/strong&gt; The system was stuck in a paradoxical loop: It required validation, but its own validation mechanism was offline. This generated the error message, essentially asking users to &lt;em&gt;unblock&lt;/em&gt; a system that was internally blocked, leading to the widespread &lt;strong&gt;500 Internal Server Errors&lt;/strong&gt; that crippled two of the world’s most highly trafficked sites.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ The Developer's Dilemma: Centralization vs. Resilience
&lt;/h2&gt;

&lt;p&gt;This incident is more than just breaking news; it’s a required syllabus update for any developer building in the &lt;strong&gt;Next.js, Svelte, or modern full-stack ecosystem&lt;/strong&gt;. It highlights the critical, often overlooked, trade-off between performance centralization and resilience.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The Single Point of Failure (SPOF) Tax&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Our push toward optimizing applications with services like Cloudflare Workers, Edge Functions, and global CDNs—designed to be performant—has inadvertently concentrated massive risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions for the Post-Outage Dev Cycle:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If your primary &lt;strong&gt;Next.js&lt;/strong&gt; or &lt;strong&gt;Nuxt.js&lt;/strong&gt; deployment relies heavily on a single provider for its Edge layer, what is your fallback?&lt;/li&gt;
&lt;li&gt;Should we start implementing &lt;strong&gt;multi-CDN strategies&lt;/strong&gt; as a standard for all high-traffic applications?&lt;/li&gt;
&lt;li&gt;How can we design applications to &lt;strong&gt;gracefully degrade&lt;/strong&gt; when security layers (like the WAF challenge) fail, rather than presenting a complete blackout?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📈 Moving Beyond the Fix: Architectural Mandates for 2026
&lt;/h2&gt;

&lt;p&gt;The immediate fix is on Cloudflare's engineers. The long-term architectural fix is on &lt;strong&gt;us&lt;/strong&gt;. As we look ahead to 2026, resilience cannot be an afterthought; it must be a mandated feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Three Non-Negotiable Resilience Strategies:&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Separate DNS from CDN:&lt;/strong&gt; Maintain your DNS registrar and settings with a provider distinct from your primary CDN. If one fails, you can quickly pivot traffic using the other.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Health Checks &amp;amp; Multi-Provider Failover:&lt;/strong&gt; Implement continuous health checks on the CDN layer. Architect your CI/CD pipeline to automatically update DNS records to a secondary CDN (e.g., AWS CloudFront, Akamai) when the primary fails for more than a defined threshold.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Client-Side Graceful Degradation:&lt;/strong&gt; Use service workers or client-side caching to ensure that in the event of a total network failure, users are presented with cached content or a custom, helpful error screen, rather than the confusing, generic error messages we saw today.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;strong&gt;&lt;code&gt;challenges.cloudflare.com&lt;/code&gt;&lt;/strong&gt; error will be fixed soon, but the vulnerability it revealed will linger until we architect it out of existence.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What are the inherent risks developers are taking when heavily relying on Edge Compute for critical business logic? Share your thoughts below!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cdn</category>
      <category>ai</category>
      <category>cloud</category>
    </item>
    <item>
      <title>🦇 Haunted Pixels: A Cinematic Halloween Landing Page</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Thu, 06 Nov 2025 11:23:57 +0000</pubDate>
      <link>https://dev.to/paulthedev/haunted-pixels-a-cinematic-halloween-landing-page-57p7</link>
      <guid>https://dev.to/paulthedev/haunted-pixels-a-cinematic-halloween-landing-page-57p7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2025-10-15"&gt;Frontend Challenge - Halloween Edition, Perfect Landing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎃 What I Built
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Haunted Pixels&lt;/strong&gt; is a fully interactive Halloween landing page. Part art installation, part frontend engineering showcase.&lt;/p&gt;

&lt;p&gt;Built with &lt;strong&gt;React + TypeScript + Tailwind&lt;/strong&gt;, it merges atmospheric design with smooth interactivity to create a &lt;em&gt;living&lt;/em&gt;, breathing haunted world inside the browser.&lt;br&gt;
Every layer from the fog and lightning to the crawling spiders is modular and reactive.&lt;/p&gt;
&lt;h4&gt;
  
  
  ✨ Core Features
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🧱 &lt;strong&gt;Component-based horror system&lt;/strong&gt; — Each visual effect (bats, spiders, lightning, glitch, etc.) is an independent React component.&lt;/li&gt;
&lt;li&gt;🕸 &lt;strong&gt;Dynamic Floating Entities&lt;/strong&gt; — Animated bats and spiders drift across the viewport in organic motion loops.&lt;/li&gt;
&lt;li&gt;💀 &lt;strong&gt;Cinematic Parallax + Glitch FX&lt;/strong&gt; — Multi-depth background and screen distortions amplify immersion.&lt;/li&gt;
&lt;li&gt;💡 &lt;strong&gt;Responsive &amp;amp; Accessible&lt;/strong&gt; — Smooth scroll, keyboard focus, and semantic alt tags on all visual elements.&lt;/li&gt;
&lt;li&gt;⏰ &lt;strong&gt;Animated Header&lt;/strong&gt; — Real-time spooky clock, glowing logo, and smooth transitions on scroll.&lt;/li&gt;
&lt;li&gt;🔊 &lt;strong&gt;Ambient Creepy Audio&lt;/strong&gt; — Subtle sound layers that adapt with movement and hover.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  👻 Demo
&lt;/h3&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://couragecodejourney.github.io/haunted-pixels-perfect/" rel="noopener noreferrer"&gt;https://couragecodejourney.github.io/haunted-pixels-perfect/&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/CourageCodeJourney/haunted-pixels-perfect" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

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


&lt;h3&gt;
  
  
  🧩 Technical Breakdown
&lt;/h3&gt;

&lt;p&gt;The landing page is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React + TypeScript&lt;/strong&gt; for maintainable and modular UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for scalable, token-driven theming (custom HSL palette for Halloween tones).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite&lt;/strong&gt; for lightning-fast builds and GitHub Pages deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Animation System:&lt;/strong&gt;
Defined in &lt;code&gt;index.css&lt;/code&gt; using CSS keyframes for &lt;code&gt;ghost-float&lt;/code&gt;, &lt;code&gt;blood-drip&lt;/code&gt;, &lt;code&gt;bat-fly&lt;/code&gt;, and &lt;code&gt;screen-shake&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Component Example – Floating Entities&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEntities&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Entity&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="nf"&gt;useEffect&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;types&lt;/span&gt; &lt;span class="o"&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;bat&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="s2"&gt;bat&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="s2"&gt;bat&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="s2"&gt;spider&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="s2"&gt;spider&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="s2"&gt;spider&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="s2"&gt;spider&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nf"&gt;setEntities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&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="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&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="na"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&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="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&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="kd"&gt;type&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="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each entity is independently animated, creating believable random movement without heavy libraries.&lt;/p&gt;




&lt;h3&gt;
  
  
  🕯 Journey
&lt;/h3&gt;

&lt;p&gt;I wanted to push beyond typical Halloween themes not just spooky visuals, but a &lt;strong&gt;haunted atmosphere&lt;/strong&gt; that feels alive.&lt;/p&gt;

&lt;p&gt;I experimented with layering depth and rhythm: subtle motion, ambient flickers, and light-to-dark transitions that react to scroll and hover.&lt;/p&gt;

&lt;p&gt;The hardest challenge was balancing &lt;strong&gt;performance&lt;/strong&gt; and &lt;strong&gt;cinematic animation&lt;/strong&gt;, ensuring the multiple background and entity layers ran smoothly on mobile while retaining visual fidelity.&lt;/p&gt;

&lt;p&gt;I also implemented a minimal &lt;strong&gt;design system&lt;/strong&gt; via HSL tokens, so colors, shadows, and glows could be tuned across all components consistently.&lt;/p&gt;

&lt;p&gt;In the end, &lt;strong&gt;Haunted Pixels&lt;/strong&gt; became more than a landing page, it’s a technical mood piece that fuses frontend fundamentals with Halloween storytelling.&lt;/p&gt;




&lt;p&gt;🦇 &lt;em&gt;“Enter if you dare.”&lt;/em&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>CSS Nightmares: Building a Haunted Scene That Actually Creeped Me Out</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Mon, 03 Nov 2025 12:59:12 +0000</pubDate>
      <link>https://dev.to/paulthedev/css-nightmares-building-a-haunted-scene-that-actually-creeped-me-out-1kbb</link>
      <guid>https://dev.to/paulthedev/css-nightmares-building-a-haunted-scene-that-actually-creeped-me-out-1kbb</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2025-10-15"&gt;Frontend Challenge - Halloween Edition, CSS Art&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiration
&lt;/h2&gt;

&lt;p&gt;You know that feeling when you're watching a horror movie and everything seems just a little &lt;em&gt;too&lt;/em&gt; quiet? That moment right before something jumps out? That's what I wanted to capture. I've always loved haunted houses and the creepy-crawly feeling of Halloween night, so I decided to pour all those spooky vibes into one terrifying CSS scene. The blood moon watching over everything, the spiders that seem to move when you're not looking directly at them, the ghosts that float just at the edge of your vision - it's all the stuff that made me sleep with the lights on as a kid!&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;See the horror come alive:&lt;/strong&gt; &lt;a href="https://couragecodejourney.github.io/halloween-css-art-submission/" rel="noopener noreferrer"&gt;Live Demo Here&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Code &amp;amp; Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source Code:

&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/CourageCodeJourney" rel="noopener noreferrer"&gt;
        CourageCodeJourney
      &lt;/a&gt; / &lt;a href="https://github.com/CourageCodeJourney/halloween-css-art-submission" rel="noopener noreferrer"&gt;
        halloween-css-art-submission
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Pure CSS Halloween Art — a haunted night scene built entirely with HTML and CSS animations.
    &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;🕸️halloween-css-art-submission&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Pure CSS Halloween Art — a haunted night scene built entirely with HTML and CSS animations.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;📂 Project Structure&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;halloween-css-art/
│
├── index.html        # Main HTML file that loads the CSS and displays the scene
└── halloween.css     # All the styling and animations (core of the art)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🧱 File Breakdown&lt;/h3&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;index.html&lt;/strong&gt;&lt;/h4&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Contains the root structure of the Halloween scene.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Each &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; represents an object or animated element in the scene — e.g.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.blood-moon&lt;/code&gt; → glowing red moon&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.haunted-house&lt;/code&gt; → central building with windows and doors&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.spider&lt;/code&gt;, &lt;code&gt;.ghost&lt;/code&gt;, &lt;code&gt;.pumpkin&lt;/code&gt;, &lt;code&gt;.skeleton&lt;/code&gt;, etc. → animated elements&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;The file only references one stylesheet:&lt;/p&gt;

&lt;div class="highlight highlight-text-html-basic notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-kos"&gt;&amp;lt;&lt;/span&gt;&lt;span class="pl-ent"&gt;link&lt;/span&gt; &lt;span class="pl-c1"&gt;rel&lt;/span&gt;="&lt;span class="pl-s"&gt;stylesheet&lt;/span&gt;" &lt;span class="pl-c1"&gt;href&lt;/span&gt;="&lt;span class="pl-s"&gt;halloween.css&lt;/span&gt;" &lt;span class="pl-kos"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;&lt;strong&gt;halloween.css&lt;/strong&gt;&lt;/h4&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Defines &lt;strong&gt;all visual elements and animations&lt;/strong&gt; for the scene.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Key techniques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Positioning:&lt;/strong&gt; Absolute layout to place each object precisely&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gradients:&lt;/strong&gt; Used to paint every shape (no images used)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animations:&lt;/strong&gt; Controlled via &lt;code&gt;@keyframes&lt;/code&gt; for motion…&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/CourageCodeJourney/halloween-css-art-submission" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;




&lt;/li&gt;

&lt;li&gt;Built with: Pure HTML &amp;amp; CSS (no JavaScript!)&lt;/li&gt;

&lt;li&gt;License: MIT&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;Oh man, where do I even start? This project was equal parts "wow this is so cool!" and "why did I think this was a good idea?!" &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good, the bad, and the downright spooky:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'll be honest - I almost gave up on the spiders. Getting those legs to wiggle naturally using just CSS transforms was driving me crazy! I must have rewritten those keyframes a dozen times. There was this one night I was working late, and the combination of the dark room and my own creepy creation actually made me jump when the lightning effect fired unexpectedly. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised me:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How much you can do with just ::before and ::after pseudo-elements (my HTML file is surprisingly clean!)&lt;/li&gt;
&lt;li&gt;The blood moon's pulsing effect turned out way creepier than I expected&lt;/li&gt;
&lt;li&gt;Those little demon eyes that blink randomly? They started as an afterthought but became one of my favorite details&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The "aha!" moments:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realizing I could use CSS variables for the spider leg angles&lt;/li&gt;
&lt;li&gt;Figuring out how to make the ghosts look like they're floating unevenly&lt;/li&gt;
&lt;li&gt;Discovering that subtle glitch effect that makes the whole scene feel unstable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I'd do differently next time:&lt;/strong&gt;&lt;br&gt;
I'd probably start with a better organization system for all those animations! My CSS file got pretty wild there for a while. Also, I learned the hard way that too many drop-shadows can really slow things down.&lt;/p&gt;

&lt;p&gt;This project reminded me why I fell in love with CSS in the first place - it's like digital witchcraft. You're just typing these incantations and suddenly things move, glow, and come to life. Even after all the frustration, there's nothing quite like watching your creation breathe for the first time.&lt;/p&gt;

&lt;p&gt;Now if you'll excuse me, I need to go watch some cartoons to get these creepy vibes out of my system! 🎃👻&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
    </item>
    <item>
      <title>My First Merge Almost Gave Me a Panic Attack: A Hacktoberfest Maintainer's Story</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Thu, 30 Oct 2025 17:10:39 +0000</pubDate>
      <link>https://dev.to/paulthedev/my-first-merge-almost-gave-me-a-panic-attack-a-hacktoberfest-maintainers-story-4mei</link>
      <guid>https://dev.to/paulthedev/my-first-merge-almost-gave-me-a-panic-attack-a-hacktoberfest-maintainers-story-4mei</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest2025"&gt;2025 Hacktoberfest Writing Challenge&lt;/a&gt;: Maintainer Spotlight&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My hands were actually shaking.&lt;/p&gt;

&lt;p&gt;I was staring at my first-ever pull request as a maintainer. Some stranger on the internet had found my little side project and wanted to contribute code.&lt;/p&gt;

&lt;p&gt;My brain was screaming: "You're not a real maintainer! You just built a glowing dot that spins! What if you break their code? What if you mess this up?"&lt;/p&gt;

&lt;p&gt;I'd created this project during one of those 2 AM coding sessions where everything feels either brilliant or completely insane. The idea was simple: what if Hacktoberfest looked less like a list of numbers and more like a galaxy?&lt;/p&gt;

&lt;p&gt;So I pushed a single HTML file with one glowing circle, added a "good first issue" tag because that's what you're supposed to do, and went to bed fully expecting exactly zero people to ever see it.&lt;/p&gt;

&lt;p&gt;And now... someone was here. With actual code.&lt;/p&gt;

&lt;p&gt;I took a deep breath, clicked "Merge," and...&lt;/p&gt;

&lt;p&gt;It worked.&lt;/p&gt;

&lt;p&gt;That mix of terror and excitement? That's where our galaxy actually began.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then Things Got Real
&lt;/h2&gt;

&lt;p&gt;That first merge was like opening a floodgate. People started actually contributing to my little project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sai&lt;/strong&gt; was first - he added these beautiful shooting stars that made our static galaxy feel alive. Suddenly we had comets streaking across the screen.&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%2Forjwe22kpq4kskbliaot.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%2Forjwe22kpq4kskbliaot.jpg" alt="Shooting stars animation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then &lt;strong&gt;Mohit&lt;/strong&gt; messaged me: "Hey, I added a little astronaut floating around your galaxy!"&lt;/p&gt;

&lt;p&gt;I opened his PR and there it was - this tiny astronaut slowly orbiting through our digital space. That little astronaut hit me different - it represented all of us floating into the open source universe.&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%2Fv9sxgk9pyiatw2k9fyhp.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%2Fv9sxgk9pyiatw2k9fyhp.jpg" alt="more convo"&gt;&lt;/a&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%2F3g3zbsxrjm1hlpafmvnz.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%2F3g3zbsxrjm1hlpafmvnz.jpg" alt="github convo"&gt;&lt;/a&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%2Fsm6povehs2yqewwf9xz2.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%2Fsm6povehs2yqewwf9xz2.png" alt="astronut"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the real "oh wow" moment came when &lt;strong&gt;Praful&lt;/strong&gt; submitted a massive PR that added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Orbiting satellites with blinking lights&lt;/li&gt;
&lt;li&gt;A warp speed effect when you click the main repo
&lt;/li&gt;
&lt;li&gt;"Code rain" that falls from contributor avatars&lt;/li&gt;
&lt;li&gt;Enhanced tooltips and animations&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I looked at the "Files changed" tab and my jaw dropped. This wasn't my little weekend project anymore - it was becoming something real.&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%2Fgmnqp2g1rprwuxgsvtl4.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%2Fgmnqp2g1rprwuxgsvtl4.jpg" alt="file chnage"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Day Everything Broke
&lt;/h2&gt;

&lt;p&gt;Here's the part nobody tells you about being a maintainer: sometimes you have to un-merge someone's hard work.&lt;/p&gt;

&lt;p&gt;PR #8 added background music. I merged it. Then realized it was causing issues with other features. I had to run &lt;code&gt;git revert&lt;/code&gt; - the scariest command in Git. It feels like you're deleting someone's contribution.&lt;/p&gt;

&lt;p&gt;Then came the merge conflict from hell. Praful's massive PR #15 collided with my local changes, turning our &lt;code&gt;index.html&lt;/code&gt; into a 1,400-line sea of &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;/code&gt; and &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; pr-15&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For two hours, my terminal looked 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;CONFLICT (content): Merge conflict in index.html
Auto-merging index.html failed
git merge --abort
git reset --hard origin/main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pure panic. I finally fixed it, but learned the real lesson: &lt;strong&gt;being a maintainer isn't about Git wizardry -it's about communication.&lt;/strong&gt; A simple "Hey, can you pull the latest changes first?" would have saved me two hours of sweating.&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%2Fcqlqwzf6i8e76wx69fh9.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%2Fcqlqwzf6i8e76wx69fh9.jpg" alt="communication"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What I Actually Do as a Maintainer
&lt;/h2&gt;

&lt;p&gt;Turns out, maintaining an open source project has very little to do with writing brilliant code and everything to do with being a good host.&lt;/p&gt;

&lt;p&gt;You're basically running a digital potluck. Everyone brings something different, and your job is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure they feel welcome&lt;/li&gt;
&lt;li&gt;Help their contribution fit with everything else&lt;/li&gt;
&lt;li&gt;Say "thank you" for every single PR, even the tiny ones&lt;/li&gt;
&lt;li&gt;Keep the lights on for the next person&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every "Looks great, merging!" comment matters. Every quick review might be what keeps someone coding when they're about to give up.&lt;/p&gt;

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

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

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

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

&lt;h2&gt;
  
  
  Our Galaxy Today
&lt;/h2&gt;

&lt;p&gt;That single glowing dot I started with? Here's what the community built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;200+ twinkling stars&lt;/strong&gt; with different animations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Floating asteroids&lt;/strong&gt; and &lt;strong&gt;nebula clouds&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;orbiting astronaut&lt;/strong&gt; and &lt;strong&gt;satellites&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shooting stars&lt;/strong&gt; and &lt;strong&gt;comets&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive features&lt;/strong&gt; like warp speed and code rain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Music toggle&lt;/strong&gt; (we got it working!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animated stats&lt;/strong&gt; that count up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a living, breathing piece of art built by 7+ contributors from around the world.&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to Add Your Star?
&lt;/h2&gt;

&lt;p&gt;We've still got plenty of space (pun intended) for more contributors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issue #19:&lt;/strong&gt; Help refactor our massive HTML file into separate CSS/JS files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue #16:&lt;/strong&gt; Fix mobile responsiveness (it gets squished on phones)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issue #6:&lt;/strong&gt; Fix typos or add comments (perfect first PR!)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Or come up with your own idea!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out our &lt;a href="https://github.com/CourageCodeJourney/hacktoberfest-code-galaxy/issues" rel="noopener noreferrer"&gt;open issues&lt;/a&gt; - there's something for every skill level.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Magic
&lt;/h2&gt;

&lt;p&gt;My first Hacktoberfest, I was too nervous to contribute. I thought my small fixes didn't matter.&lt;/p&gt;

&lt;p&gt;This project proved me wrong.&lt;/p&gt;

&lt;p&gt;Hacktoberfest Code Galaxy isn't just a visualization - it's proof that every contribution matters.&lt;/p&gt;

&lt;p&gt;It's Sai's comets lighting up the sky.&lt;br&gt;
It's Mohit's astronaut exploring new frontiers.&lt;br&gt;&lt;br&gt;
It's Praful's satellites orbiting the repo.&lt;br&gt;
It's every person who showed up and said "Hey, can I help?"&lt;/p&gt;

&lt;p&gt;We're not just writing code - we're building a constellation of collaboration. And that's way cooler than any single line of code I could write alone.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Special thanks to Sai, Mohit, Praful, and everyone who added their star to our galaxy 🌟&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S. I want to sincerely apologize for the quality of the images. I tried multiple ways to enhance them, but they didn't come out as clear as I'd hoped. Thank you for bearing with me, I hope you were still able to see all the cool features the community built!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/CourageCodeJourney/hacktoberfest-code-galaxy" rel="noopener noreferrer"&gt;github.com/CourageCodeJourney/hacktoberfest-code-galaxy&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://couragecodejourney.github.io/hacktoberfest-code-galaxy" rel="noopener noreferrer"&gt;couragecodejourney.github.io/hacktoberfest-code-galaxy&lt;/a&gt;&lt;/p&gt;




</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Passwordless SSH Setup in 5 Minutes (The Right Way in 2025)</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Tue, 21 Oct 2025 12:18:36 +0000</pubDate>
      <link>https://dev.to/paulthedev/passwordless-ssh-setup-in-5-minutes-the-right-way-in-2025-2co</link>
      <guid>https://dev.to/paulthedev/passwordless-ssh-setup-in-5-minutes-the-right-way-in-2025-2co</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh gideon@192.168.1.10
gideon@192.168.1.10’s password:
(...typing...)
Permission denied, please try again.
(...louder typing...)
Permission denied, please try again.
(...SIGH...)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You know that moment.&lt;br&gt;
You’re ready to deploy, in your zone, and SSH decides to make you type a 14-character password from memory. Twice. Maybe three times if your pinky slips.&lt;/p&gt;

&lt;p&gt;It’s 2025. We can do better.&lt;/p&gt;

&lt;p&gt;In this quick guide, we’re going to set up &lt;strong&gt;passwordless SSH the right way&lt;/strong&gt; using modern cryptography, secure defaults, and a workflow that’s actually worth your muscle memory.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Why “Passwordless” Isn’t Really Passwordless
&lt;/h2&gt;

&lt;p&gt;Let’s clear something up.&lt;br&gt;
“Passwordless” is catchy, but what we’re &lt;em&gt;actually&lt;/em&gt; setting up is &lt;strong&gt;key-based authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here’s how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 &lt;code&gt;id_ed25519&lt;/code&gt; → your &lt;strong&gt;private key&lt;/strong&gt; (never leaves your local machine)&lt;/li&gt;
&lt;li&gt;🔓 &lt;code&gt;id_ed25519.pub&lt;/code&gt; → your &lt;strong&gt;public key&lt;/strong&gt; (lives on the server)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The private key is your secret signature. The public key is the lock it fits into. Together, they create a secure, unguessable login handshake with no password guessing or brute forcing.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ Step 1: Generate Your Modern SSH Key
&lt;/h2&gt;

&lt;p&gt;Forget RSA, it’s 2025. The gold standard now is &lt;strong&gt;ED25519&lt;/strong&gt;, which is faster, smaller, and more secure.&lt;/p&gt;

&lt;p&gt;On your local machine, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll be asked two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Where to save the key:&lt;/strong&gt; Press &lt;strong&gt;Enter&lt;/strong&gt; for default (&lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passphrase:&lt;/strong&gt; &lt;em&gt;Yes, you should use one.&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Think of your passphrase as a password &lt;em&gt;for your key&lt;/em&gt;, not for the server.&lt;br&gt;
If your laptop gets stolen, your private key is useless without it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gives you a key pair in &lt;code&gt;~/.ssh/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id_ed25519      # private
id_ed25519.pub  # public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Step 2: Copy Your Key to the Server
&lt;/h2&gt;

&lt;p&gt;The easy way (and the correct one) is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id user@your_server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll enter your password &lt;strong&gt;one last time&lt;/strong&gt;, and the command takes care of everything — creating &lt;code&gt;~/.ssh&lt;/code&gt;, setting permissions, and adding your public key to &lt;code&gt;authorized_keys&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  If &lt;code&gt;ssh-copy-id&lt;/code&gt; Isn’t Installed (Manual Method)
&lt;/h3&gt;

&lt;p&gt;Run this instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub | ssh user@your_server_ip &lt;span class="s2"&gt;"mkdir -p ~/.ssh &amp;amp;&amp;amp; chmod 700 ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys &amp;amp;&amp;amp; chmod 600 ~/.ssh/authorized_keys"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This manually sets up your public key on the remote server with proper permissions.&lt;br&gt;
Not as elegant, but bulletproof.&lt;/p&gt;


&lt;h2&gt;
  
  
  🪄 Step 3: The Moment of Truth
&lt;/h2&gt;

&lt;p&gt;Now, log in again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh user@your_server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you didn’t use a passphrase, boom, you’re in instantly.&lt;br&gt;
If you did, you’ll see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enter passphrase for key '/home/you/.ssh/id_ed25519':
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type it once, and you’re in securely.&lt;br&gt;
That’s progress.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 Step 4: Go Fully Passwordless with &lt;code&gt;ssh-agent&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;You might be thinking,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Wait… didn’t I just replace one password with another?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here’s the fix: use an &lt;strong&gt;SSH agent&lt;/strong&gt; to remember your key for your whole session.&lt;/p&gt;

&lt;p&gt;Start the agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add your key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter your passphrase once, and that’s it.&lt;br&gt;
Now you can SSH into your servers all day, password-free.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Pro tip: add this to your &lt;code&gt;.bashrc&lt;/code&gt; or &lt;code&gt;.zshrc&lt;/code&gt;:&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;So your session auto-loads your key each login.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  🔒 Step 5: Lock It Down — Disable Password Logins
&lt;/h2&gt;

&lt;p&gt;Your key works. You’re fast.&lt;br&gt;
Now let’s make it &lt;em&gt;secure&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Log into your server (using your key), then edit SSH’s config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PasswordAuthentication yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PermitRootLogin no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restart SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart sshd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;IMPORTANT:&lt;/strong&gt; Before restarting SSH, open a second terminal and confirm your key login works.&lt;br&gt;
If you lock yourself out, you’ll need physical server access or console recovery.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧾 Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Generate Key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ssh-keygen -t ed25519 -C "email@example.com"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copy Key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ssh-copy-id user@server&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start Agent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eval "$(ssh-agent -s)"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add Key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ssh-add ~/.ssh/id_ed25519&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disable Passwords&lt;/td&gt;
&lt;td&gt;Edit &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Security Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[x] SSH key authentication enabled&lt;/li&gt;
&lt;li&gt;[x] Password login disabled&lt;/li&gt;
&lt;li&gt;[x] Root login disabled&lt;/li&gt;
&lt;li&gt;[x] SSH agent configured&lt;/li&gt;
&lt;li&gt;[x] Keys backed up securely&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 FAQs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Does this work on Ubuntu, CentOS, and macOS?&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Yes, the commands are the same. Just ensure the &lt;code&gt;openssh-server&lt;/code&gt; package is installed on Linux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; What’s the difference between password and key authentication?&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Passwords can be guessed. Keys can’t. They use asymmetric cryptography, which is exponentially more secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Can I use the same key for multiple servers?&lt;br&gt;
&lt;strong&gt;A:&lt;/strong&gt; Yes, and you should. Just copy your &lt;code&gt;.pub&lt;/code&gt; key to each one.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 The Payoff
&lt;/h2&gt;

&lt;p&gt;Next time you type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh user@server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and it just &lt;em&gt;works&lt;/em&gt;, no password, no delay, that’s freedom.&lt;/p&gt;

&lt;p&gt;You’ve traded frustration for flow.&lt;br&gt;
You’ve replaced brute force with elegance.&lt;br&gt;
And you’ve taken one big step toward a cleaner, more secure workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 What’s Your SSH Pro Tip?
&lt;/h2&gt;

&lt;p&gt;Do you use a &lt;code&gt;~/.ssh/config&lt;/code&gt; file? Maybe multiplexing or ControlMaster connections?&lt;br&gt;
Drop your favorite SSH trick in the comments — I’ll feature the best ones in the follow-up: &lt;strong&gt;“Advanced SSH Hardening for 2025.”&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>linux</category>
      <category>security</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stop Using `useEffect` for Data Fetching in React. Here’s a Better Way</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Wed, 08 Oct 2025 09:03:16 +0000</pubDate>
      <link>https://dev.to/paulthedev/stop-using-useeffect-for-data-fetching-in-react-heres-a-better-way-2kkj</link>
      <guid>https://dev.to/paulthedev/stop-using-useeffect-for-data-fetching-in-react-heres-a-better-way-2kkj</guid>
      <description>&lt;p&gt;If you've been a React developer for more than a week, you've almost certainly written the following pattern (or a variation of it) countless times:&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;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&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="kd"&gt;const&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="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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;let&lt;/span&gt; &lt;span class="nx"&gt;isMounted&lt;/span&gt; &lt;span class="o"&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;// For cleanup race conditions&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;fetchData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&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="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;/api/my-resource&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP error! status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&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="p"&gt;}&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&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;response&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="nx"&gt;isMounted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nf"&gt;setData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="nx"&gt;isMounted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nf"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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="k"&gt;finally&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;isMounted&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nf"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&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="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;fetchData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;return &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="nx"&gt;isMounted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Cleanup&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;// Oh, the dependency array...&lt;/span&gt;
  &lt;span class="c1"&gt;// What goes here? An empty array? What if my API needs a prop?&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;loading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Loading&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&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="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;My&lt;/span&gt; &lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/pre&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This boilerplate code is ubiquitous in React applications. It's how we've been taught to handle side effects, including &lt;strong&gt;data fetching&lt;/strong&gt;, since the introduction of Hooks.&lt;/p&gt;

&lt;p&gt;But here's the uncomfortable truth: &lt;strong&gt;Using &lt;code&gt;useEffect&lt;/code&gt; for data fetching in React components is often an anti-pattern.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It leads to common bugs, unnecessary complexity, and a less performant user experience. In modern React development, dedicated data fetching libraries offer a vastly superior approach.&lt;/p&gt;




&lt;p&gt;The Problem with &lt;code&gt;useEffect&lt;/code&gt; for Data Fetching&lt;/p&gt;

&lt;p&gt;While &lt;code&gt;useEffect&lt;/code&gt; is powerful and essential for many side effects (like synchronizing with external APIs, logging, or manually manipulating the DOM), it was &lt;strong&gt;never designed to be a data fetching solution&lt;/strong&gt;. When you force it into this role, you inherit a host of issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Race Conditions and Stale Closures (The &lt;code&gt;isMounted&lt;/code&gt; Nightmare)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your component unmounts before your asynchronous fetch request resolves, trying to update state on an unmounted component can lead to errors and memory leaks. The &lt;code&gt;isMounted&lt;/code&gt; flag is a common workaround, but it's boilerplate you shouldn't have to write for every fetch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manual Caching, Revalidation, and Deduplication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useEffect&lt;/code&gt; doesn't inherently cache your data. If the user navigates away and then back to a page, or if multiple components request the same data, &lt;code&gt;useEffect&lt;/code&gt; will trigger redundant fetches. You end up implementing your own caching layer, which is notoriously difficult to get right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Global State Management (Loading/Error States)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Managing &lt;code&gt;loading&lt;/code&gt; and &lt;code&gt;error&lt;/code&gt; states for every single fetch request across your application quickly becomes verbose and inconsistent. You often need to lift these states up or pass them down, creating prop drilling or context hell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Re-fetching on Focus, Network Reconnection, etc.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real-world applications need to intelligently re-fetch data. If the user's internet connection drops and then comes back, or if they switch browser tabs and return, your data might be stale. &lt;code&gt;useEffect&lt;/code&gt; offers no built-in solution for these common UX requirements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Strict Mode Double Invocation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In React's Strict Mode (which you should absolutely be using in development), &lt;code&gt;useEffect&lt;/code&gt; runs twice on mount to help you catch bugs related to improper cleanup. While this is great for ensuring proper side effect management, it can lead to frustrating double fetches if not handled carefully, making your development experience slower.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These aren't theoretical problems; they are everyday struggles for React developers.&lt;/p&gt;




&lt;p&gt;The Better Way: Dedicated Data Fetching Libraries&lt;/p&gt;

&lt;p&gt;The React ecosystem has evolved, and specialized libraries have emerged to abstract away the complexities of data fetching, caching, and synchronization. The two leading contenders are &lt;strong&gt;React Query&lt;/strong&gt; (part of TanStack Query) and &lt;strong&gt;SWR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both libraries provide elegant solutions to all the &lt;code&gt;useEffect&lt;/code&gt; problems listed above and more. Let's look at a simple example using &lt;strong&gt;React Query&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introducing React Query (TanStack Query)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React Query is a powerful library for managing server state. It provides hooks that handle the entire data fetching lifecycle for you, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Caching:&lt;/strong&gt; Automatically caches fetched data, making subsequent requests instant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revalidation:&lt;/strong&gt; Intelligently revalidates data in the background (e.g., on window focus, network reconnect, interval).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loading/Error States:&lt;/strong&gt; Exposes &lt;code&gt;isLoading&lt;/code&gt;, &lt;code&gt;isError&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt; from a single hook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication:&lt;/strong&gt; Prevents multiple identical requests from firing simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimistic Updates:&lt;/strong&gt; Makes your UI feel instant by updating it before the server confirms changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devtools:&lt;/strong&gt; Provides an amazing developer experience with a built-in Devtools panel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's refactor our &lt;code&gt;MyComponent&lt;/code&gt; example using React Query:&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;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;QueryClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;QueryClientProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tanstack/react-query&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ReactQueryDevtools&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@tanstack/react-query-devtools&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Optional for dev&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Create a QueryClient instance&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;queryClient&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;QueryClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// A simple fetcher function (can be async)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchMyResource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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;response&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;/api/my-resource&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP error! status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&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="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="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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&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. Use the useQuery hook&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isLoading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isError&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="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;queryKey&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="s1"&gt;myResource&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// Unique key for this query&lt;/span&gt;
    &lt;span class="na"&gt;queryFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fetchMyResource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// The function that fetches your data&lt;/span&gt;
    &lt;span class="na"&gt;staleTime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Data is considered fresh for 5 minutes&lt;/span&gt;
    &lt;span class="c1"&gt;// You can add many more options here like refetchOnWindowFocus, retry, etc.&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;isLoading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Loading&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&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;isError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&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="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;My&lt;/span&gt; &lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;pre&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/pre&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;// 3. Wrap your App or a portion of it with QueryClientProvider&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&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="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;QueryClientProvider&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;queryClient&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyComponent&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Optional: React Query Devtools for debugging */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ReactQueryDevtools&lt;/span&gt; &lt;span class="nx"&gt;initialIsOpen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/QueryClientProvider&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at how much cleaner and more robust this is!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No &lt;code&gt;useState&lt;/code&gt; for loading/error.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;isMounted&lt;/code&gt; flags.&lt;/li&gt;
&lt;li&gt;Automatic caching.&lt;/li&gt;
&lt;li&gt;Automatic revalidation.&lt;/li&gt;
&lt;li&gt;Less code, fewer bugs, better user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What about SWR?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://swr.vercel.app/" rel="noopener noreferrer"&gt;SWR&lt;/a&gt; (stale-while-revalidate) by Vercel offers a very similar and equally powerful API. It's also an excellent choice and shares many of the same benefits as React Query. The choice between them often comes down to personal preference or specific feature requirements. Both are vastly superior to manual &lt;code&gt;useEffect&lt;/code&gt; fetching.&lt;/p&gt;




&lt;p&gt;When &lt;code&gt;useEffect&lt;/code&gt; IS Appropriate (The Nuance)&lt;/p&gt;

&lt;p&gt;This isn't to say &lt;code&gt;useEffect&lt;/code&gt; is evil or useless. It has its place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synchronizing with external systems:&lt;/strong&gt; Think integrating with a third-party analytics script, a WebSocket connection, or manually interacting with the DOM (e.g., measuring an element's size).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logging:&lt;/strong&gt; Sending analytics events when a component mounts or a specific state changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting up subscriptions:&lt;/strong&gt; When you need to subscribe to an event listener and clean it up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key distinction is that &lt;code&gt;useEffect&lt;/code&gt; is for &lt;strong&gt;synchronizing internal component state with an external system&lt;/strong&gt;, not for managing server state that should be cached, revalidated, and deduplicated.&lt;/p&gt;




&lt;p&gt;Conclusion: Evolve Your React Data Fetching&lt;/p&gt;

&lt;p&gt;If you're still relying on &lt;code&gt;useEffect&lt;/code&gt; for the bulk of your data fetching in React, you're likely working harder, writing more code, and introducing more potential bugs than necessary.&lt;/p&gt;

&lt;p&gt;Modern React applications benefit immensely from dedicated data fetching libraries like &lt;strong&gt;React Query&lt;/strong&gt; or &lt;strong&gt;SWR&lt;/strong&gt;. They treat server state as a first-class citizen, providing a robust, performant, and delightful developer experience.&lt;/p&gt;

&lt;p&gt;It's time to &lt;strong&gt;stop treating &lt;code&gt;useEffect&lt;/code&gt; as your primary data fetching solution&lt;/strong&gt; and embrace the tools built specifically for the job. Your code will be cleaner, your app faster, and your debugging sessions shorter.&lt;/p&gt;




&lt;p&gt;What are your thoughts?&lt;/p&gt;

&lt;p&gt;Are you still using &lt;code&gt;useEffect&lt;/code&gt; for data fetching, or have you made the switch to a library like React Query or SWR? What challenges did you face, and what benefits have you seen? Let's discuss in the comments below!&lt;/p&gt;




</description>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ASTROWORLD Intranet: Modern Digital Workspace</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Mon, 28 Jul 2025 11:34:31 +0000</pubDate>
      <link>https://dev.to/paulthedev/astroworld-intranet-modern-digital-workspace-dfl</link>
      <guid>https://dev.to/paulthedev/astroworld-intranet-modern-digital-workspace-dfl</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've built ASTROWORLD, a comprehensive intranet homepage that transforms how teams collaborate and access information. This responsive dashboard serves as a central hub for workplace communication, resource sharing, and project tracking - all wrapped in a visually engaging interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built&lt;/strong&gt;&lt;br&gt;
ASTROWORLD is a feature-rich intranet solution designed to enhance workplace productivity and connection. Key components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Personalized Dashboard with user-specific welcome messages&lt;/li&gt;
&lt;li&gt;Upcoming Events calendar with meeting details&lt;/li&gt;
&lt;li&gt;Resource Library for quick document access&lt;/li&gt;
&lt;li&gt;Team Spotlight with colleague profiles and status indicators&lt;/li&gt;
&lt;li&gt;Project Tracking with visual progress bars&lt;/li&gt;
&lt;li&gt;Team Availability sidebar showing real-time status&lt;/li&gt;
&lt;li&gt;Dark/Light Mode toggle with persistent user preference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface balances aesthetics and functionality, featuring clean typography, consistent spacing, and purposeful color coding for intuitive information hierarchy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo&lt;/strong&gt;&lt;br&gt;
Experience ASTROWORLD live:&lt;br&gt;
&lt;a href="https://couragecodejourney.github.io/intranet-dashboard/" rel="noopener noreferrer"&gt;View Full Page Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Journey&lt;/strong&gt;&lt;br&gt;
Creating ASTROWORLD was a rewarding challenge that pushed my frontend development skills to new heights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Design Philosophy&lt;/strong&gt;&lt;br&gt;
I focused on creating a workspace that balances professionalism with visual appeal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blue gradient theme conveys trust and innovation&lt;/li&gt;
&lt;li&gt;Card-based layout organizes information intuitively&lt;/li&gt;
&lt;li&gt;Strategic white space reduces cognitive load&lt;/li&gt;
&lt;li&gt;Purposeful animations enhance interaction&lt;/li&gt;
&lt;li&gt;Consistent iconography improves navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical Implementation&lt;/strong&gt;&lt;br&gt;
I built the entire interface with pure HTML, CSS, and vanilla JavaScript:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSS Grid and Flexbox for responsive layouts&lt;/li&gt;
&lt;li&gt;CSS Variables for consistent theming&lt;/li&gt;
&lt;li&gt;Mobile-First Approach with progressive enhancement&lt;/li&gt;
&lt;li&gt;Semantic HTML for accessibility&lt;/li&gt;
&lt;li&gt;Canvas API for dynamic avatar generation&lt;/li&gt;
&lt;li&gt;LocalStorage for theme persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Challenges Overcome&lt;/strong&gt;&lt;br&gt;
The most complex aspects included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a responsive layout that adapts from desktop to mobile&lt;/li&gt;
&lt;li&gt;Implementing smooth dark/light mode transitions&lt;/li&gt;
&lt;li&gt;Developing the interactive notification system&lt;/li&gt;
&lt;li&gt;Generating dynamic team member avatars&lt;/li&gt;
&lt;li&gt;Ensuring consistent spacing and typography hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Accessibility Focus&lt;/strong&gt;&lt;br&gt;
I prioritized inclusive design with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4.5:1 minimum color contrast ratios&lt;/li&gt;
&lt;li&gt;Semantic HTML structure&lt;/li&gt;
&lt;li&gt;Keyboard navigable interface&lt;/li&gt;
&lt;li&gt;ARIA roles and labels&lt;/li&gt;
&lt;li&gt;Focus states for interactive elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I'm Proud Of&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic Avatar System: Automatically generates unique profile images&lt;/li&gt;
&lt;li&gt;Theme Persistence: Remembers user's dark/light mode preference&lt;/li&gt;
&lt;li&gt;Interactive Cards: Hover and click effects that provide feedback&lt;/li&gt;
&lt;li&gt;Performance Optimization: Entire solution under 20KB&lt;/li&gt;
&lt;li&gt;Real-Time Status Indicators: Visual cues for team availability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned&lt;/strong&gt;&lt;br&gt;
This project deepened my understanding of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Advanced CSS Grid techniques&lt;/li&gt;
&lt;li&gt;Accessibility best practices&lt;/li&gt;
&lt;li&gt;JavaScript event delegation&lt;/li&gt;
&lt;li&gt;Performance optimization strategies&lt;/li&gt;
&lt;li&gt;User-centered design principles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ASTROWORLD represents my vision for a modern digital workspace - connecting people, resources, and information in an intuitive interface that adapts to user preferences and device constraints.&lt;/p&gt;

&lt;p&gt;License: MIT License&lt;br&gt;
Note: By submitting this entry, I grant Axero Solutions a worldwide, royalty-free license to use this submission in accordance with the challenge terms. I affirm that I hold all necessary rights to grant this license.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Welcome to My Office (Made with CSS Magic ✨)</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Wed, 23 Jul 2025 11:43:21 +0000</pubDate>
      <link>https://dev.to/paulthedev/welcome-to-my-office-made-with-css-magic--jk0</link>
      <guid>https://dev.to/paulthedev/welcome-to-my-office-made-with-css-magic--jk0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, CSS Art: Office Culture&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ever stared at your screen for too long and thought, “What if my office desk was made entirely out of CSS?” No? Just me? Well… I did it anyway. I built a full-blown, interactive &lt;strong&gt;CSS art piece&lt;/strong&gt; that captures the chaos, charm, and caffeine-fueled spirit of modern office life. From your keyboard lighting up as you type that email for the 7th time, to your favorite mug steaming with infinite coffee, it’s all here.&lt;/p&gt;

&lt;h3&gt;
  
  
  🖼️ &lt;a href="https://couragecodejourney.github.io/cssofficeart/" rel="noopener noreferrer"&gt;Click Here for the Live 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%2F6iijr13e98jdtjqngeis.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%2F6iijr13e98jdtjqngeis.png" alt="CSS Office Culture Preview" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 What’s Inside?
&lt;/h3&gt;

&lt;p&gt;Let’s take a quick office tour:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💻 A monitor with endlessly scrolling code (because bugs never sleep)&lt;/li&gt;
&lt;li&gt;⌨️ Keyboard keys that light up like a rave every time you hover&lt;/li&gt;
&lt;li&gt;☕ Coffee mug steaming like it’s brewing life into your soul&lt;/li&gt;
&lt;li&gt;🧊 Water cooler with animated convos (yes, tea is being spilled)&lt;/li&gt;
&lt;li&gt;🪴 Plants that gently sway because HR said "Add greenery"&lt;/li&gt;
&lt;li&gt;🏢 A window-lit building to remind you it's still Monday&lt;/li&gt;
&lt;li&gt;📱 Fully responsive, so your office shrinks perfectly to mobile size!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✍️ My Creative Process (aka how I almost lost my mind but didn’t)
&lt;/h3&gt;

&lt;p&gt;I started by sketching out the scene. Yes, on actual paper. Then came the fun part turning each element into CSS. I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gradients, borders, and pseudo-elements for &lt;em&gt;juicy&lt;/em&gt; details&lt;/li&gt;
&lt;li&gt;Over 10 custom animations (because stillness is boring)&lt;/li&gt;
&lt;li&gt;Media queries to keep the art from falling apart on mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Fun Things I Learned:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How to make a cup of coffee.......with CSS&lt;/li&gt;
&lt;li&gt;That animating a keyboard can feel oddly satisfying&lt;/li&gt;
&lt;li&gt;You can make conversations happen at the water cooler, even in code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Next Steps:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Add draggable sticky notes (because who doesn’t like dragging stuff?)&lt;/li&gt;
&lt;li&gt;Make a day/night toggle so you can switch from burnout to blackout&lt;/li&gt;
&lt;li&gt;Maybe add sound effects? (Typing ASMR, anyone?)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built using 100% HTML and CSS (and just a sprinkle of JavaScript for those snazzy key animations). MIT licensed, so feel free to fork, remix, and add your own coffee mug 😄&lt;/p&gt;

&lt;p&gt;Let me know what you think or what I should add next!&lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Research Assistant Built with Runner H: Paper Reviews in Minutes</title>
      <dc:creator>Courage Labhani Paul</dc:creator>
      <pubDate>Thu, 26 Jun 2025 14:51:58 +0000</pubDate>
      <link>https://dev.to/paulthedev/research-assistant-built-with-runner-h-paper-reviews-in-minutes-2hk6</link>
      <guid>https://dev.to/paulthedev/research-assistant-built-with-runner-h-paper-reviews-in-minutes-2hk6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/runnerh"&gt;Runner H "AI Agent Prompting" Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built an AI-powered Research Assistant using Runner H that automates the entire literature review process. The agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🔍 Searches arXiv, PubMed, and IEEE for newly published papers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🧠 Filters results by recency (7 days) and relevance (85%+)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✍️ Extracts core contributions, methodologies, and limitations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Compiles clean, publication-ready summaries in Google Docs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📢 Instantly posts the final report to Slack for easy team access&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're a researcher, student, or startup founder, this on-demand agent saves hours and delivers high-quality insights in just one prompt.&lt;/p&gt;

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

&lt;p&gt;📹 &lt;strong&gt;Watch the full workflow in action:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;🖼️ &lt;strong&gt;Screenshots:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Generated Research Summary in Google Docs&lt;/strong&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%2F1d1cppu3uqukz0vl801a.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%2F1d1cppu3uqukz0vl801a.png" alt="courage paul"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Slack Notification with Summary Link&lt;/strong&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%2F8jfdgvvwh99gjq5la3ea.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%2F8jfdgvvwh99gjq5la3ea.png" alt="courage paul"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Used Runner H
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Full Prompt:&lt;/strong&gt; "&lt;em&gt;You are my Research Assistant. First, ask me what topic I would like the research summary to focus on. Once I provide the topic, confirm it by saying something like “Great, you’ve chosen: [Topic]. Should I proceed?” After confirmation, search arXiv, PubMed, and IEEE for new academic papers related to that topic, filtering for those published in the past 7 days with relevance score &amp;gt;85%. For each paper, extract the core contribution in one sentence, list three key methodologies used, and identify any limitations. Compile the findings into a Google Document titled “[Topic] Research Summary – [Date]”, formatted with clear sections for the title, contribution, methodologies, and limitations for each paper. Finally, share the link to the Google Doc in the Slack #research channel with a brief summary message".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ What the Agent Does&lt;/strong&gt;&lt;br&gt;
This prompt powers an autonomous research assistant that handles the entire literature review process from a single input. Here's how the workflow breaks down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Dynamic Topic Collection&lt;/strong&gt;&lt;br&gt;
The agent starts by asking the user to provide a research topic, this keeps it reusable across fields and disciplines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Intelligent Search + Filtering&lt;/strong&gt;&lt;br&gt;
It searches arXiv, PubMed, and IEEE Xplore for relevant academic papers published in the last 7 days, then filters out any that score under 85% relevance based on semantic similarity to the given topic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Structured Information Extraction&lt;/strong&gt;&lt;br&gt;
For each papers, the agent extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A core contribution summary&lt;/li&gt;
&lt;li&gt;Three key methodologies&lt;/li&gt;
&lt;li&gt;Any stated limitations by the authors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Formatted Report Generation&lt;/strong&gt;&lt;br&gt;
The agent automatically creates a Google Doc with organized sections, making it ready for publishing, team review, or academic citation. Each paper is clearly broken into Title, Contribution, Methodologies, and Limitations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Slack Integration&lt;/strong&gt;&lt;br&gt;
The final document is posted directly into a dedicated Slack channel (#research) so the team or user can access the latest findings instantly.&lt;/p&gt;
&lt;h2&gt;
  
  
  Use Case &amp;amp; Impact
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;This solution is perfect for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧪 PhD students and academic researchers conducting topic reviews&lt;/li&gt;
&lt;li&gt;💼 Startup founders and execs keeping up with trends in their domain&lt;/li&gt;
&lt;li&gt;📊 Product, growth, and AI teams needing technical insight without drowning in PDFs&lt;/li&gt;
&lt;li&gt;🎓 Students working on dissertations, term papers, or proposals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔍 Why It Matters&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manual literature reviews are time-consuming and error-prone.&lt;/li&gt;
&lt;li&gt;Searching across multiple databases and extracting meaningful insights takes hours.&lt;/li&gt;
&lt;li&gt;Most people don’t have a system for filtering by relevance, and often rely on keyword matches alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This agent delivers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚀 Speed — cuts down research time by 80%&lt;/li&gt;
&lt;li&gt;🎯 Precision — filters irrelevant results with semantic analysis&lt;/li&gt;
&lt;li&gt;🧘🏾‍♀️ Convenience — compiles everything and drops it in Slack, hands-free&lt;/li&gt;
&lt;li&gt;♻️ Reusability — works across any research domain with zero code changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a scalable way to support better, faster, and more informed decision-making in research-driven environments.&lt;/p&gt;
&lt;h3&gt;
  
  
  Social Love
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1938246094917407069-411" src="https://platform.twitter.com/embed/Tweet.html?id=1938246094917407069"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1938246094917407069-411');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1938246094917407069&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;I’d love to be considered for the &lt;strong&gt;Community Champion&lt;/strong&gt; prize category, this project is for researchers, students, and anyone trying to save time with AI!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>runnerhchallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
